DFHJS2LS 中可变的元素数组
JSON 可以包含一些具有不同数量的元素的数组。 一般而言,包含可变数量的元素的 JSON 模式无法高效地映射到单个高级语言数据结构中。 CICS® 使用基于容器的映射或内联映射来处理 JSON 数据中的不同数量的元素。
"type" 值为 "array" 的模式中使用 minItems 和 maxItems 关键字,在 JSON 模式中表示具有不同数量的元素的数组:minItems关键字指定元素可以出现的最小次数。 其值可以是 0 或任何正整数。 其缺省值为 0。maxItems关键字指定元素可以出现的最大次数。 其值可以是大于或等于minItems关键字的值的任何正整数。- 如果
maxItems关键字缺失,那么意味着数组可无限大。
"maxItems":1的变量数组表示,如以下称为 "component"的可选 8 字节字符串示例中所示:"properties":
{
"component":
{
"type":"array",
"maxItems":1,
"items":
{
"type": "string",
"maxLength": 8
}
}
},
"required": ["component"]"required" 关键字值中不包含字段名称来产生相同结果:"properties":
{"component":
{
"type": "string",
"maxLength": 8
}
}- 当 CICS 将 JSON 数据转换为应用程序数据时,它会使用应用程序数据填充这些结构,并且应用程序会读取这些结构。
- 当 CICS 将应用程序数据转换为 JSON 数据时,它会读取应用程序已填充的结构中的应用程序数据。
以下示例说明了这些数据结构的格式。 这些示例使用简单 8 字节字段的数组。 然而,模型也支持复杂数据类型的数组以及包含其他数组的数据类型的数组。
示例 1: 固定元素数
"properties":
{"component":
{
"type": "array",
"maxItems": 3,
"minItems": 3,
"items":
{
"type": "string",
"maxLength": 8
}
}
},
"required": ["component"]
05 component PIC X(8) OCCURS 3 TIMES示例 2. 映射级别 2 和更低级别的元素数量不同
"properties":
{"component":
{
"type": "array",
"maxItems": 5,
"minItems": 1,
"items":
{
"type": "string",
"maxLength": 8
}
}
},
"required": ["component"]component-num 包含元素在 JSON 数据中出现的次数,第二个字段 component-cont 包含容器的名称:05 component-num PIC S9(9) COMP-5
05 component-cont PIC X(16)01 DFHJS-component
02 component PIC X(8)您必须检查 component-num 的值,该值将包含 1 到 5 范围内的值,以查找元素出现的次数。 元素内容位于 component-cont 中指定的容器中; 容器包含一组元素,其中每个元素都由 DFHJS-component 数据结构映射。
minItems="0" 或缺少 maxItems="1" ,那么该元素是可选的。 要处理应用程序中的数据结构,必须检查 component-num 的值:- 如果为零,那么消息没有组件元素,并且未定义
component-cont的内容。 - 如果为 1,那么组件元素在
component-cont中所指定的容器内。
容器的内容由 DFHJS-component 数据结构映射。
示例 3. 映射级别 2.1 及以上的元素的可变数量
- INLINE-MAXOCCURS-LIMIT 的缺省值为 1,该值确保可选元素进行内联映射。
- INLINE-MAXOCCURS-LIMIT 参数的值 0 会阻止内联映射。
- 如果
maxItems小于或等于 INLINE-MAXOCCURS-LIMIT 的值,那么将使用内联映射。 - 如果
maxItems大于 INLINE-MAXOCCURS-LIMIT 的值,那么将使用基于容器的映射。
component-num 字段指示存在多少个元素实例,并且数组指向这些实例。 对于 示例 2 中显示的示例。 映射级别 2 和更低级别的元素数量不同,当 INLINE-MAXOCCURS-LIMIT 小于或等于 5 时,生成的数据结构如下所示:05 component-num PIC S9(9) COMP-5 SYNC.
05 component OCCURS 5 PIC X(8).第一个字段 component-num 与上一节中基于容器的映射示例的输出相同。 第二个字段包含一个长度为 5 的数组,此长度足以包含可生成的最大数量的元素。
内联映射与基于容器的映射不同,后者存储元素的出现次数以及放置数据的容器的名称,因为它将所有数据都存储在当前容器中。 将数据存储在当前容器中通常会提高性能并使内联映射成为首选。
示例 4。 嵌套变量数组
复杂 JSON 模式可以包含可变重现元素,这些元素进而又包含可变重现元素。 在此情况下,所描述的结构会扩展到超越这些示例中所描述的两个级别。
"component2" 的可选元素,该元素嵌套在名为 "component1" 的必需元素中,其中该必需元素可以出现 1 到 5 次:"properties":
{"component1":
{
"type": "array",
"maxItems": 5,
"minItems": 1,
"items":
{
"type": "object",
"properties":
{"component2":
{
"type": "string",
"maxLength": 8
}
},
"required": ["component2"]
}
}
},
"required": ["component1"]05 component1-num PIC S9(9) COMP-5
05 component1-cont PIC X(16)01 DFHJS-component1
02 component2-num PIC S9(9) COMP-5
02 component2-cont PIC X(16)01 DFHJS-component2
02 component2 PIC X(8)最外层元素 "component1" 的出现次数在 component1-num 中。
component1-cont 中指定的容器包含一个数组,其中包含第二个数据结构 DFHJS-component1的实例数。
每个 component2-cont 实例命名一个不同的容器,每个容器都包含由第三级结构 DFHJS-component2映射的数据结构。
{"component1":
[
{"component2": "string1"},
{"component2": "string2"},
]
}"component1" 出现三次。 前两个包含 "component2" 的实例; 第三个实例不存在。
component1-num 包含值 3。 component1-cont 中指定的容器具有三个 DFHJS-component1实例:- 在第一个中,
component2-num的值为 1,而component2-cont中指定的容器保存 string1。 - 在第二个中,
component2-num的值为 1,而component2-cont中指定的容器保存 string2。 - 在第三个中,
component2-num的值为 0,并且component2-cont的内容未定义。
- 容器 DFHJS-DATA 中的根数据结构。
component1-cont中指定的容器。component2-cont的前两个实例中指定的两个容器。
可选结构和 required 关键字
数据结构由 "object" JSON 模式 "type" 定义。 这些模式使用 "properties" 关键字提供的对象将字段名称与单独类型相关联。 这些字段要作为 JSON 模式所描述 JSON 数据一部分的需求由 "required" 关键字提供的数组来控制。 此数组列出必须在 JSON 数据中存在的所有字段名称。 因此,可选字段通过其在该数组中的缺失来表示,或者由于不允许该数组为空,通过 "required" 关键字的缺失来表示。 在此情况下,所有字段都为可选。
可选字段被视为可变的 0 或 1 个元素的数组。 这将使用追加到元素名称的后缀
"-num" 添加附加字段。 如果总长度超出了 28 个字符,那么将截断元素名称。 在运行时,这为非零以指示该值存在于 JSON 数据中,如果不存在,那么为零。
"required-structure" ,另一个是可选的,称为 "optional-structure":{
"type": "object",
"properties":
{"required-structure":
{
"type":"string",
"maxLength": 8
},
"optional-structure":
{
"type":"string",
"maxLength": 8
}
},
"required":
["required-structure"]
}"optional-structure-num" 前缀,此前缀是元素的整数计数,0 表示无,1 表示存在。 设置该值是为了指示 "optional-structure" 是否包含有效数据。03 OutputData.
06 required-structure PIC X(8).
06 optional-structure-num PIC S9(9) COMP-5 SYNC.
06 optional-structure PIC X(8).