Serializer options

Options of the json.Serializer class.

Table 1. Serializer options
Option Description Default Example use
allowNullAsDefault Allow NULL values to be accepted during deserialization (JSON/BDL) when the json_null="null" attribute is not explicitly specified. Applies to deserialization only. 0

(NULL values are not allowed)

CALL json.Serializer.setOption("allowNullAsDefault",1) For examples, go to Example 1: JSON to BDL deserialization options to allow nulls
serializeNullAsDefault Allow NULL values to be accepted during serialization (BDL/JSON), even if constraints are set (for example, JSONRequired defined or json_null="null" not defined). Applies to serialization only. 0

(NULL values are not allowed)

CALL json.Serializer.setOption("serializeNullAsDefault",1) For examples, go to Example 2: BDL to JSON serialization options to allow nulls

Examples

Options of the json.Serializer class usage examples.

Example 1: JSON to BDL deserialization options to allow nulls

To relax deserialization, you can set the allowNullAsDefault option to allow nulls.

By default, Genero Web Services JSON to BDL deserialization will raise errors if the JSON content does not match the BDL variable receiving the data.

For example, if the BDL variable is defined as follows:
TYPE tAddress RECORD
    street STRING,
    city STRING,
    state STRING,
    zip STRING
END RECORD

TYPE tCustomer RECORD
    id STRING,
    name STRING,
    address tAddress
END RECORD
The following JSON document will by default raise conversion errors because the "address" element is defined as "null", which does not correspond with the BDL variable:
{
  "id": "1",
  "name": "John Doe",
  "address": null
}
To avoid the conversion error, set the following option to allow nulls in your server module:
CALL json.Serializer.setOption( "allowNullAsDefault", 1 )

For more details, go to json.Serializer.setOption.

Alternatively, you can define the BDL variable with the attributes value json_null="null" to handle JSON serialization of null values.
TYPE tAddress RECORD ATTRIBUTES(json_null="null")
    street STRING,
    city STRING,
    state STRING,
    zip STRING
END RECORD
For more information, go to Using the json_null="null" attribute.

Example 2: BDL to JSON serialization options to allow nulls

To relax serialization, you can set the serializeNullAsDefault option to allow nulls.

By default, Genero Web Services BDL to JSON serialization will raise errors if NULL values are sent as in this example:
IMPORT JSON

CONSTANT TNAME = "one_value_withoutNull()"
DEFINE 
    writer json.JSONWriter,
    t TEXT,
    str STRING

MAIN
    LOCATE t in MEMORY
    DISPLAY "\nSTART ", TNAME

    TRY
        LET writer = json.JSONWriter.Create()
        CALL writer.setOutputCharset("UTF-8")
        CALL writer.writeToText(t)
        CALL writer.startJSON()
        CALL json.Serializer.variableToJSON(str, writer)
        CALL writer.endJSON()
        CALL writer.close()
        DISPLAY "Should raise a serialization error"
        DISPLAY "json: ", t
        EXIT PROGRAM 1
    CATCH
        DISPLAY status || ": " || sqlca.sqlerrm
        DISPLAY "END " || TNAME || " ok"
    END TRY
END MAIN
error-15807 is raised and the following output is returned because "str" is NULL:
START one_value_withoutNull()
-15807: Primitive value cannot be serialized to 'null'
END one_value_withoutNull() ok

Serializing data with nulls to JSON using serializeNullAsDefault

To avoid serialization errors, set the serializeNullAsDefault option to allow nulls. This option will allow null values even when a JSONRequired constraint is set:
IMPORT JSON

CONSTANT TNAME = "object_withOption()"

DEFINE rec RECORD
    a STRING ATTRIBUTE(JSONRequired),
    b INTEGER
END RECORD
DEFINE 
    writer json.JSONWriter,
    t TEXT
MAIN
    LOCATE t in MEMORY
    DISPLAY "\nSTART ", TNAME

    TRY
        LET writer = json.JSONWriter.Create()
        CALL writer.setOutputCharset("UTF-8")
        CALL writer.writeToText(t)
        CALL writer.startJSON()
        CALL json.Serializer.setOption("serializeNullAsDefault",1)
        CALL json.Serializer.variableToJSON(rec, writer)
        CALL writer.endJSON()
        CALL writer.close()
        DISPLAY "json: ", t
    CATCH
        DISPLAY status || ": " || sqlca.sqlerrm
        EXIT PROGRAM 1
    END TRY

    DISPLAY "END " || TNAME || " ok"

    # reset serializeNullAsDefault to default
    CALL json.Serializer.setOption("serializeNullAsDefault",0)

END MAIN

No serialization error is raised and the following output is produced with null values:

START object_withOption()
json: {"a":null,"b":0}
END object_withOption() ok

For more details about serializeNullAsDefault, go to json.Serializer.setOption.

Serialization error with nulls in an array

By default, Genero Web Services BDL to JSON serialization will raise errors if NULL values are sent in an array as in this example:
IMPORT JSON

CONSTANT TNAME = "array_withoutNull()"
DEFINE arr DYNAMIC ARRAY OF STRING
DEFINE 
    writer json.JSONWriter,
    t TEXT

MAIN
    LOCATE t in MEMORY
    DISPLAY "\nSTART ", TNAME

    LET arr[1] = "foo"
    LET arr[2] = NULL

    TRY
        LET writer = json.JSONWriter.Create()
        CALL writer.setOutputCharset("UTF-8")
        CALL writer.writeToText(t)
        CALL writer.startJSON()
        CALL json.Serializer.variableToJSON(arr, writer)
        CALL writer.endJSON()
        CALL writer.close()
        DISPLAY "Should generate serialization error"
        DISPLAY "json: ", t
        EXIT PROGRAM 1
    CATCH
        DISPLAY status || ": " || sqlca.sqlerrm
        DISPLAY "END " || TNAME || " ok"
    END TRY
END MAIN
error-15807 is raised and the following output is returned because "arr[2]" is NULL:
START array_withoutNull()
-15807: Array cannot serialize 'null' elements. It requires json_null="null"
END array_withoutNull() ok

Serializing array with nulls to JSON using serializeNullAsDefault

To avoid serialization errors in arrays, set the serializeNullAsDefault option to allow nulls. This option will allow null values:
IMPORT JSON

CONSTANT TNAME = "array_withOption()"
DEFINE arr DYNAMIC ARRAY OF STRING
DEFINE 
    writer json.JSONWriter,
    t TEXT

MAIN
    LOCATE t in MEMORY
    DISPLAY "\nSTART ", TNAME

    LET arr[1] = "foo"
    LET arr[2] = NULL

    TRY
        LET writer = json.JSONWriter.Create()
        CALL writer.setOutputCharset("UTF-8")
        CALL writer.writeToText(t)
        CALL writer.startJSON()
        CALL json.Serializer.setOption("serializeNullAsDefault",1)
        CALL json.Serializer.variableToJSON(arr, writer)
        CALL writer.endJSON()
        CALL writer.close()
        DISPLAY "json: ", t
    CATCH
        DISPLAY status || ": " || sqlca.sqlerrm
        EXIT PROGRAM 1
    END TRY

    DISPLAY "END " || TNAME || " ok"
    # reset serializeNullAsDefault to default
    CALL json.Serializer.setOption("serializeNullAsDefault",0)
END MAIN

No serialization error is raised and the following output is produced with null values:

START array_withOption()
json: ["foo",null]
END array_withOption() ok

For more details about serializeNullAsDefault, go to json.Serializer.setOption.

Using json_null="null" to manage JSON serialization of null values

Alternatively, you can define BDL variables with the attributes value json_null="null" to allow JSON serialization of null values.
DEFINE str STRING ATTRIBUTE(json_null="null")
You can define an array with the json_null="null" attribute to handle a null index or an attempt to serialize it without elements. For examples, go to Using the json_null="null" attribute.