DFHJS2LS 中可变的元素数组

JSON 可以包含一些具有不同数量的元素的数组。 一般而言,包含可变数量的元素的 JSON 模式无法高效地映射到单个高级语言数据结构中。 CICS® 使用基于容器的映射或内联映射来处理 JSON 数据中的不同数量的元素。

通过在 "type" 值为 "array" 的模式中使用 minItemsmaxItems 关键字,在 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
         }
    }
一般而言,包含可变数量的元素的 JSON 模式无法高效地映射到单个高级语言数据结构中。 为了处理这些情况, CICS 使用一系列已连接的数据结构,这些数据结构在一系列容器中传递到应用程序。 这些结构用作应用程序的输入和输出:
  • 当 CICS 将 JSON 数据转换为应用程序数据时,它会使用应用程序数据填充这些结构,并且应用程序会读取这些结构。
  • 当 CICS 将应用程序数据转换为 JSON 数据时,它会读取应用程序已填充的结构中的应用程序数据。

以下示例说明了这些数据结构的格式。 这些示例使用简单 8 字节字段的数组。 然而,模型也支持复杂数据类型的数组以及包含其他数组的数据类型的数组。

示例 1: 固定元素数

本示例说明了出现正好三次的元素:
"properties":
   {"component": 
        {
          "type": "array",
          "maxItems": 3,
          "minItems": 3,
          "items": 
              {
                "type": "string",
                "maxLength": 8
               }
          }
      },
"required": ["component"]
在本示例中,事先已知道元素的出现次数,因此可以在简单的 COBOL 声明中将其表示为固定长度的数组,或者表示为其他语言中的对等项。
05 component PIC X(8) OCCURS 3 TIMES

示例 2. 映射级别 2 和更低级别的元素数量不同

本示例说明了可出现 1 到 5 次的必需元素:
"properties":
   {"component": 
        {
          "type": "array",
          "maxItems": 5,
          "minItems": 1,
          "items": 
             {
               "type": "string",
               "maxLength": 8
              }
         }
    },
"required": ["component"]
主数据结构包含两个字段的声明。 当 CICS 将 JSON 数据转换为二进制数据时,第一个字段 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 数据结构映射。

注: 如果 JSON 数据由单个重现元素组成,那么 DFHJS2LS 将生成两种语言结构。 主要语言结构包含数组中元素的数量以及保存元素数组的容器的名称。 第二个语言结构映射该重现元素的单个实例。

示例 3. 映射级别 2.1 及以上的元素的可变数量

在映射级别 2.1 及更高版本上,可以在 CICS 助手中使用 INLINE-MAXOCCURS-LIMIT 参数。 INLINE-MAXOCCURS-LIMIT 参数指定用来处理可变数量的元素的方式。 不同数量的元素的映射选项是基于容器的映射,如 示例 2 中所述。 映射级别 2 和更低 或内联映射的元素数量不同。 该参数的值可以是范围 0 - 32767 中的一个正整数:
  • 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映射的数据结构。

为说明此结构,请考虑与以下示例匹配的 JSON 数据片段:
{"component1":
    [
      {"component2": "string1"},
      {"component2": "string2"},
     ]
}

"component1" 出现三次。 前两个包含 "component2" 的实例; 第三个实例不存在。

在顶级数据结构中, component1-num 包含值 3。 component1-cont 中指定的容器具有三个 DFHJS-component1实例:
  1. 在第一个中,component2-num 的值为 1,而 component2-cont 中指定的容器保存 string1
  2. 在第二个中,component2-num 的值为 1,而 component2-cont 中指定的容器保存 string2
  3. 在第三个中,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"]
}
生成的 COBOL 结构显示两个字段,第二个字段带有 "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).