JSON 解析器和域
JSON (JavaScript 对象表示法) 是基于 JavaScript 编程语言子集的简单数据交换格式。
IBM® App Connect Enterprise 提供对 JSON 域的支持。 JSON 域中的消息由 JSON 解析器和序列化器处理。 JSON 解析器使用 JSON 语法解释位流,并生成相应的 JSON 域逻辑消息树。 在处理输出数据时,JSON 序列化器从 JSON 域逻辑消息树生成 JSON 格式化位流。
JSON 解析器和序列化器不支持消息验证,因为 JSON 消息建模不受支持。
- 采用以下类型的对象(“名称/值”对):
- 字符串
- Number
- 布尔
- Null
- 有序值集合(数组)
JSON 解析器只接受 JSON 对象或 JSON 数组作为输入位流和输出位流中的顶级值类型。 如果不先将 JSON 字符串字面值、数字、布尔值或空值嵌入对象或数组,则无法使用 JSON 解析器输出这些值。
有关 JSON 消息结构的更多信息,请参阅 JSON 消息详细信息。
- 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 Domain。 XSLTransform 节点不支持 JSON 域。
在序列化 JSON 消息树时,集成节点将 HTTP 内容类型头设置为 application/json,除非消息流设置了显示值。
在集成节点消息树中,JSON 对象建模为 NameValue 元素的序列。 解析器按照其在位流中遇到成员的顺序构建消息树。 序列化器按照树顺序将对象成员写入位流。
- 包含简单值的数组;例如:
"array1" : [ "thing1", 1 ]生成以下消息树:(0x01001000:Array): array1 = ( (0x03000000:NameValue):Item = 'thing1' (CHARACTER) (0x03000000:NameValue):Item = 1 (INTEGER) )JSON 解析器假定名称
Item为 NameValue 元素。 - 包含对象的数组;例如:
"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)
)
)
)