JSON 解析器和域

JSON (JavaScript 对象表示法) 是基于 JavaScript 编程语言子集的简单数据交换格式。

IBM® App Connect Enterprise 提供对 JSON 域的支持。 JSON 域中的消息由 JSON 解析器和序列化器处理。 JSON 解析器使用 JSON 语法解释位流,并生成相应的 JSON 域逻辑消息树。 在处理输出数据时,JSON 序列化器从 JSON 域逻辑消息树生成 JSON 格式化位流。

JSON 解析器和序列化器不支持消息验证,因为 JSON 消息建模不受支持。

JSON 采用独立于语言的文本格式,基于两个结构:
  • 采用以下类型的对象(“名称/值”对):
    • 字符串
    • Number
    • 布尔
    • Null
  • 有序值集合(数组)
对象和数组可嵌套。

JSON 解析器只接受 JSON 对象或 JSON 数组作为输入位流和输出位流中的顶级值类型。 如果不先将 JSON 字符串字面值、数字、布尔值或空值嵌入对象或数组,则无法使用 JSON 解析器输出这些值。

有关 JSON 消息结构的更多信息,请参阅 JSON 消息详细信息

可以从集成节点支持的任何编码字符集标识 (CCSID) 解析 JSON 数据流。 将根据从输入或请求节点调用 JSON 解析器时传输定义的 CCSID 解析数据流,或者由 CREATE 函数调用上的 PARSE 子句中的 CCSID 参数进行定义。 如果未指定 CCSID,或者如果将值设置为 0,那么解析器尝试检测(通过检查数据流的前几个字节)是否正在使用以下一个 Unicode 编码:
  • UTF-8
  • UTF-16BE
  • UTF-16LE
  • UTF-32BE
  • UTF-32LE

如果显示指定 UTF-* CCSID,那么 JSON 解析器在数据流起始位置容许相应的字节顺序标记 (BOM)。

JSON 数据流将解析为 JSON 解析器根目录的 Data 元素下的逻辑消息树。 逻辑树结构显示在 示例 JSON 消息中。

可以从 ESQL (作为 JSON.Data) , Java™ (作为 JSON/Data) 通过使用 "添加用户定义" 函数从 图形数据映射编辑器 定义 JSON->Data 或 XPath (作为 $Body/Data) 访问和处理 Data 元素。 如果未按照 JSON 语法格式化位流,那么 JSON 解析器发出错误。

JSON 序列化器将消息树序列化为 JSON 格式数据流。 CCSID 可以由集成节点属性树或消息组合件中的传输头进行定义。 如果未定义 CCSID,那么序列化器缺省为所有节点的队列管理器缺省 CCSID,HTTP 节点除外,其缺省为 UTF-8 编码。

在通过 ASBITSTREAM 函数调用来调用 JSON 序列化器时,CCSID 参数定义 CCSID。 如果未提供 CCSID 参数,或者如果值设置为 0,那么 JSON 序列化器缺省为使用 UTF-8 编码。

要使用 JSON 解析器处理消息,请选择 JSON 作为消息流的相关节点上的 Message DomainXSLTransform 节点不支持 JSON 域。

在序列化 JSON 消息树时,集成节点将 HTTP 内容类型头设置为 application/json,除非消息流设置了显示值。

在集成节点消息树中,JSON 对象建模为 NameValue 元素的序列。 解析器按照其在位流中遇到成员的顺序构建消息树。 序列化器按照树顺序将对象成员写入位流。

JSON 数组在集成节点消息树中建模为 Name 元素,带有 JSON.Array 及有序子代的特定于 JSON 解析器的类型标志。 子代可以是以下任何类型的数组:
  • 包含简单值的数组;例如:
    "array1" : [ "thing1", 1 ]
    生成以下消息树:
    (0x01001000:Array): array1 = (  
        (0x03000000:NameValue):Item = 'thing1' (CHARACTER)
        (0x03000000:NameValue):Item = 1 (INTEGER)
     )

    JSON 解析器假定名称 ItemNameValue 元素。

  • 包含对象的数组;例如:
    "array2" : [ {"a" : 1}, {"b" : 2} ]
    生成以下消息树:
    (0x01001000:Array):array2 = (
      (0x01000000:Object):Item = (
        (0x03000000:NameValue):a = 1 (INTEGER)
      )
      (0x01000000:Object):Item = (
        (0x03000000:NameValue):b = 2 (INTEGER)
      )
    )
  • 多维数组;例如:
    "array3" : [ [1.1], [2.1] ]
    生成以下消息树:
    (0x01001000:Array):array3 = (
      (0x01001000:Array):Item = (
        (0x03000000:NameValue):Item = 1.1E+0 (FLOAT)
      )
      (0x01001000:Array):Item = (
        (0x03000000:NameValue):Item = 2.1E+0 (FLOAT)
      )
    )

示例 JSON 消息

以下示例显示简单 JSON 消息:

{
    "name" : "John Doe",
    "age" : -1.0,
    "known" : false,
    "address" : { "street" : null,
                  "city" : "unknown" },
    "belongings" : ["item1", "item2", "item3"]
}

此 JSON 输入生成以下集成节点逻辑消息树:

(0x01000000:Object):JSON            = ( ['json' : 0xd55fc8]
  (0x01000000:Object):Data = (
    (0x03000000:NameValue):name       = 'John Doe' (CHARACTER)
    (0x03000000:NameValue):age        = -1E+0 (FLOAT)
    (0x03000000:NameValue):known      = FALSE (BOOLEAN)
    (0x01000000:Object   ):address    = (
      (0x03000000:NameValue):street = NULL
      (0x03000000:NameValue):city   = 'unknown' (CHARACTER)
    )
    (0x01001000:Array    ):belongings = (
      (0x03000000:NameValue):Item = 'item1' (CHARACTER)
      (0x03000000:NameValue):Item = 'item2' (CHARACTER)
      (0x03000000:NameValue):Item = 'item3' (CHARACTER)
    )
  )
)