JSON 域中的消息树映射

读取 JSON 消息时,解析器通过将 JSON 值映射到对应的消息树元素类型来根据输入位流构建消息树。 将消息树序列化成输出位流时,会将树元素类型映射到 JSON 值类型。

使用 " 图形数据映射编辑器 " 变换 JSON 消息时,请确保使用 添加用户定义 函数定义的 JSON 元素名称根据 XML 元素命名规则有效。 JSON 允许比 XML 更广泛的字符范围,例如, JSON 对象可以包含 @ 字符,但是, 图形数据映射编辑器 仅允许在 XML 或 XPath 中有效的元素名称。

下表显示如何将 JSON 消息值映射到消息树元素类型:

JSON 位流到消息树值映射

JSON 解析器根据下表中的规则将 JSON 值映射到消息树元素类型:

位流中的 JSON 值 解析为
字符串 字符

JSON 数字值呈现为:

  • 减号前缀(如果值为负)
  • 至少一个数字(可以为零)
  • 无小数点部分
  • 无指数
INTEGER

JSON 数字值呈现为:

  • 减号前缀(如果数字为负)
  • 整数部分中的至少一个数字(可以为零)
  • 以下之一或两者:
  • 点和小数部分中的至少一个数字(可以为零)
  • 使用大写“E”或小写“e”的指数、可选加号或减号以及至少一个数字
FLOAT
布尔 BOOLEAN
Null NULL

消息树到 JSON 消息值映射

JSON 序列化器根据下表中的规则将消息树元素映射到 JSON 值类型:

消息树元素类型 JSON 域序列化为
  JSON 类型 FORMAT
BIT 字符串 任何数量的 0 和 1
BLOB 字符串 偶数个十六进制数字
字符 字符串 使用 JSON 字符串对下面所列字符进行转义的字符型数据:
  • " - 引号 (U+0022)
  • \ - 反斜线 (U+005C)
  • / - 斜线 (U+002F)
  • 退格 (U+0008)
  • 换页 (U+000C)
  • 换行 (U+000A)
  • 回车符 (U+000D)
  • 跳格 (U+0009)
请参阅 https://tools.ietf.org/html/rfc7159#section-7 以获取更多详细信息。
DATE 字符串 标准 ESQL 字符串表示,“yyyy-mm-dd”
TIME 和 GMTTIME 字符串 标准 ESQL 字符串表示,“hh:mm:ss.ffffff”
INTEGER Number
  • 减号前缀(如果数字为负)
  • 至少一个数字(可以为零)
  • 无小数点
  • 无指数
FLOAT Number
  • 减号前缀(如果数字为负)
  • 整数部分中的至少一个数字(可以为零)
  • 小数部分中的至少一个数字(可以为零)
  • 使用大写“E”的指数部分、加号或减号以及至少一个数字
DECIMAL Number
  • 减号前缀(如果数字为负)
  • 整数部分中的至少一个数字(可以为零)
  • 小数部分中的至少一个数字(可以为零)

当序列化到 JSON 时,不支持十进制文字“NAN”和“INF”等。

BOOLEAN 布尔 true 或 false

序列化器仅序列化值为 true 或 false 的布尔逻辑树元素;不支持未知类型

NULL Null Null
ROW 对象

注:将 ROW 直接分配到 JSON 域树不会产生 JSON 数组。

DECLARE myRow ROW;
SET myRow.rowData[1].fieldOne = 'Row1Field1';
SET myRow.rowData[1].fieldTwo = 'Row1Field2';
SET myRow.rowData[2].fieldOne = 'Row2Field1';
SET myRow.rowData[2].fieldTwo = 'Row2Field2';
SET OutputRoot.JSON.Data.aRow = myRow;

产生以下 JSON 位流

"aRow":{
  "rowData": {"fieldOne":"Row1Field1","fieldTwo":"Row1Field2"},"
  "rowData": {"fieldOne":"Row2Field1","fieldTwo":"Row2Field2"}
}
ROW Array

要根据 ROW 类型产生 JSON 数组,还要设置 JSON.Array 字段。

SET OutputRoot.JSON.Data.aRow = myRow;
SET OutputRoot.JSON.Data.aRow TYPE = JSON.Array;

产生以下 JSON 位流

"aRow":[
  {"fieldOne":"Row1Field1","fieldTwo":"Row1Field2"},
  {"fieldOne":"Row2Field1","fieldTwo":"Row2Field2"}
]