JSON schema to C and C++ mapping

The DFHJS2LS utility programs support mappings between the JSON schemas and C and C++ data types.

The CICS® assistants generate unique, valid field names for C and C++ variables from the schema element names using the following rules:
  1. Characters other than A-Z, a-z, 0-9, or _ are replaced with 'X'.

    For example, monthly-total becomes monthlyXtotal.

  2. If the first character is not an alphabetic character, it is replaced by a leading 'X'.

    For example, _monthlysummary becomes Xmonthlysummary.

  3. Duplicate names in the same scope are made unique by the addition of one or two numeric digits to the second and subsequent instances of the name.

    For example, three instances of year become year, year1, and year2.

  4. A JSON schema specifies that a variable has varying cardinality if it has a "type" value of "array", and the keywords "minItems" and "maxItems" are omitted or have different values. If the schema specifies that the variable has varying cardinality, then field names are created with suffixes of "_cont" and "_num".

    For more information, see Variable arrays of elements in DFHJS2LS.

  5. A JSON schema specifies that a variable is optional if it does not appear in the "required" keyword array that is associated with the enclosing JSON schema "object" type. For optional fields, an additional field is generated with a suffix of _num added to the element name. At run time this is zero to indicate the value was absent from the JSON data, and non-zero if the value was present in the JSON data.
  6. Field names are limited to 50 characters. If a generated name, including any prefix and suffix, exceeds this length, the element name is truncated.
DFHJS2LS maps JSON schema type values to C and C++ data types according to the following table. The following rules also apply:
  • If the MAPPING-LEVEL parameter is set to 1.2 or higher and the CHAR-VARYING parameter is set to NULL, variable-length character data is mapped to null-terminated strings and an extra character is allocated for the null-terminator.
  • If the MAPPING-LEVEL parameter is set to 1.2 or higher and the CHAR-VARYING parameter is set to YES, variable-length character data is mapped to two related elements: a length field and a data field.
JSON Schema keyword C and C++ data type
All of:
"type":"null"
"type": []
"enum": []
"allOf"
"anyOf"
"noneOf"
"not"

Not supported

"$schema":"http://json-schema.org/draft-04/schema#"

This keyword is ignored, but it is assumed to be compatible with the draft 04 JSON Schema specification.

"title": "same text"
"description": "more text"

These keywords are ignored.

"format": "<predefined values>"

The "format" keyword is used to modify either the generated structure or runtime value. See the following information for the supported use of "format".

"type": "array",
"items": {<JSON Sub-schema>},
"additionalItems": false, 
"maxItems": m, 
"minItems": n

The only form of JSON array currently supported is a repeated number of same type values. The <JSON Sub-schema> must define a supported "type", but that "type" cannot be "array". This is a restriction on the language structure generated.

"additionalItems" is assumed to be false, and no other value is supported.

If both "minItems" and "maxItems" are present, and they are equal, then the array is treated as fixed cardinality, otherwise it is treated as varying cardinality. See Variable arrays of elements in DFHJS2LS.

"type": "array",
"uniqueItems": true

"uniqueItems" is not supported with JSON arrays. The <JSON Sub-schema> must define a supported "type", but that "type" cannot be "array". This is a restriction on the language structure generated.

"type": "object",
"additionalProperties": false,
"properties": { [ "<element name>": {<JSON Sub-schema>} [,] ]* } 
"required": [ [ "<element name>" [,] ]* ]

The only form of JSON object currently supported is a fixed set of named elements.

This will generate a structure (or sub-structure) using the element names.

"additionalProperties" is assumed to be false, and no other value is supported.

Any element in the "properties" object is considered"optional" if it is not in the "required" array or if no "required" array exists. An "optional" element is given a variable ordinality of zero to X; where X is either 1 or the maximum number of items in the array, where that item is defined as an array. See Variable arrays of elements in DFHJS2LS.

"type": "object",
"maxProperties": m,
"minProperties": n,
"patternProperties": {},
"dependencies":

None of these keywords are supported with JSON objects.

"type":"string"
"maxLength":m
"pattern": "regular expression>",
"minLength": l

char[z]

where the value of z is based on m, but dependent on the settings of the CHAR-VARYING parameter.

m is based on the "maxLength" keyword and treated as fixed length string.

"pattern" and "minLength" restrictions are passed through to the language structure only as a comment.

"type":"string"
"maxLength":m

When CCSID=1200 at mapping level 4.0 and higher:

char16_t[z]

where the value of z is based on m, but dependent on the settings of the CHAR-VARYING parameter.

m is based on the "maxLength" keyword and treated as fixed length string.

"*name*":{ 
   "type":"string",
   "format":"date-time"
}

char[8]

All supported when DATETIME=PACKED15

"*name*":{ 
   "type":"string",
   "format":"uri"
}

char[m]

where m is based on the "maxLength" keyword and treated as fixed length string.

When CCSID=1200 at mapping level 4.0 and higher:

char16_t[m]

where m is based on the "maxLength" keyword and treated as fixed length string.

"*name*":{ 
   "type":"string",
   "format":"base64Binary"
}

char[m]

where m is based on the "maxLength" keyword.

"*name*":{ 
   "type":"string",
   "format":"hexBinary"
}

char[m]

where m is based on the "maxLength" keyword.

"*name*":{ 
   "type":"string",
   "format":"<predefined>" 
}

char[m]

where m is based on the "maxLength" keyword and treated as fixed length string, and where <predefined> is one of: email, hostname, ipv4 or ipv6. A relevant "pattern" is used and passed to the comment.

When CCSID=1200 at mapping level 4.0 and higher:

char16_t[m]

where m is based on the "maxLength" keyword and treated as fixed length string, and where <predefined> is one of: emailhostnameipv4, or ipv6. A relevant "pattern" is used and passed to the comment.

"type":"boolean"
bool (C++ only)
short (C only)
"type": "integer",
"maxExclusive": true,
"minExclusive": true,
"multipleOf": n

"maxExclusive" and "minExclusive" restrictions are passed to the language structure only as a comment.

"multipleOf" is ignored.

"type":"integer",
minimum:-128,
maximum:127

signed char

"type":"integer",
minimum:0,
maximum:255

unsigned char

"type":"integer",
minimum:-32768,
maximum:32767

short

"type":"integer",
minimum:0,
maximum:65535

unsigned short

"type":"integer",
minimum:-2147483648,
maximum:2147483647

int

"type":"integer",
minimum:0,
maximum:4294967295

unsigned int

"type":"integer",
minimum:-9223372036854775808,
maximum:9223372036854775807

long long

"type":"integer",
minimum:0,
maximum:18446744073709551615

unsigned long long

"type": "number",
"maximum": m,
"minimum": n,
"maxExclusive": true,
"minExclusive": true,
"multipleOf": n

"maximum", "minimum", "maxExclusive" and "minExclusive" restrictions are passed to the language structure only as a comment.

"multipleOf" is ignored.

"type":"number"
"format":"float"
Mapping level 1.1 and lower:
  • char[32]
Mapping level 1.2 and higher:
  • float(*)
Note: The IBM® Hexadecimal Floating Point (HFP) data representation is not exactly the same as the IEEE-754-1985 representation used for JSON. Some values may not convert exactly from one representation to the other. Some extremely large or small values might not be valid for float data types. Some values may lose precision when converted to or from HFP representation. If precise conversions are important, consider replacing use of float data types with fixed precision alternatives.
"type":"number"
"format":"double"
Mapping level 1.0 and lower:
  • char[32]
Mapping level 1.2 and higher:
  • double(*)
Note: The IBM Hexadecimal Floating Point (HFP) data representation is not exactly the same as the IEEE-754-1985 representation used for JSON. Some values may not convert exactly from one representation to the other. Some extremely large or small values might not be valid for double data types. Some values may lose precision when converted to or from HFP representation. If precise conversions are important, consider replacing use of double data types with fixed precision alternatives.
Note: CICS cannot transform integer values greater than the maximum value for a signed long (2^63 - 1) unless they are enclosed within quotes.
Note: Minimum and maximum values specified in the schema for numeric types are used only to map to a C or C++ datatype. Data is not validated against these values at run time.