parseJsonTable

语法

parseJsonTable(json, [schema], [keyCaseSensitive=true])

详情

将 JSON 对象解析为内存表。JSON 字段值写入对应的输出列;列名和数据类型由 schema 指定,未指定时自动推断。

  • 当 json 是包含多个 JSON 对象的字符串时,每个对象都将转换为表的一行数据。

  • 当 json 是字符串向量时,向量中每个元素转换为表的一行数据。未指定 path 时,每个元素只解析第一个 JSON 对象。

  • 空 JSON 对象({})在结果中占一行。

参数

json 包含 JSON 对象的字符串标量或向量。

schema 可选参数,表对象,用于指定输出列名和数据类型。

如果不指定 schema,则函数根据前 10 个 JSON 对象推断表结构,再按该结构解析输入数据。

第 11 个及之后首次出现的字段会被忽略。如需读取这些字段,应通过 schema 显式指定。

未指定 schema 时,如果输入全部为空对象({}),或前 10 个对象均为空对象,函数报错。

schema 可以包含以下列(必须包含 name 和 type 列):

列名 含义

name

字符串,表示输出列名

type

字符串,表示各列的数据类型。

format

字符串,表示 JSON 中日期或时间字符串的格式

path

可选列,指定各输出列的字段路径。解析嵌套 JSON 时必须指定该列。取值规则如下:

  • STRING 标量:读取一个字段。

  • STRING 向量:按路径顺序将多个字段值组成一个向量,type 必须指定数组向量类型,例如 DOUBLE[]。

  • 标量与向量混合时,path 列使用 ANY 向量。

字段路径从 JSON 最外层对象开始。下表中的键名均为示意名称,使用时替换为实际键名;index 为从 0 开始的数组下标。

通用写法 含义

key

读取根对象的 key 字段。

parent.child

读取 parent 对象的 child 字段,点号分隔对象层级。

array[index]

读取 array 数组中指定下标的元素。

array[index].child

读取 array 数组中指定元素的 child 字段。

["key.name"]

读取完整键名为 key.name 的字段。

["key.name"].child

读取完整键名为 key.name 的对象中的 child 字段。

["key1"]["key2"]

依次访问 key1 对象和其中的 key2 字段。

键名包含点号、空格或方括号等特殊字符时,使用方括号加双引号表示完整键名。

指定 path 时:

  • JSON 最外层必须是对象,不能是数组(如 [{"id":1},{"id":2}])。对象内部可以包含数组。

  • 当 json 是 STRING 向量时,每个元素必须恰好包含一个 JSON 对象。

  • 路径不存在(包括数组下标越界)、字段值为 JSON null 或类型转换失败时,写入对应类型的 NULL。由多条路径组成的数组保留缺失值的位置。

  • 路径语法非法或 JSON 不完整时,函数报错。

keyCaseSensitive 可选参数,指定键名(包括 path 中各级键名)是否大小写敏感。默认值为 true。

返回值

一个表对象。

例子

例1:将包含多个 JSON 对象的字符串解析为表。

json1='{"ID":1, "NAME":"cc"}{"NAME":"dd"}'
parseJsonTable(json1)
ID NAME

1

cc

dd

例2:通过 format 指定日期时间字符串的解析格式。

json2 = '{"col_test":"20190522150407"}'
schemaTB = table(["col_test"] as name, ["DATETIME"] as type, ["yyyyMMddHHmmss"] as format)
parseJsonTable(json2, schemaTB)
col_test

2019.05.22T15:04:07

例3:当 json 是包含两个 JSON 对象的字符串时:

json3='{"ID":11, "NAME":"dd"}'
schemaTB1 = table(["ID", "NAME", "col_test"] as name, ["INT", "STRING", "DATETIME"] as type, [,,"yyyyMMddHHmmss"] as format)
parseJsonTable(concat([json2,json3]),schemaTB1)
ID NAME col_test

2019.05.22T15:04:07

11

dd

例4:当 json 是字符串向量时:

parseJsonTable([json2,json3],schemaTB1)
ID NAME col_test

2019.05.22T15:04:07

11

dd

例5:解析包含空 JSON 对象的字符串向量,空对象保留为一行。

home = ['{"Num":10, "Name":"Ronaldo","Goal":"3","MatchDay":"20120322"}','{"Num":3, "Name":"Carlos","Goal":"1","MatchDay":"20120322"}','{}'];
schemaLiga = table(["Num","Name","Goal","MatchDay"] as name, ["INT","STRING","INT","DATE"] as type, [,,,"yyyyMMdd"] as format);
formation = parseJsonTable(home,schemaLiga);
formation;
Num Name Goal MatchDay

10

Ronaldo

3

2012.03.22

3

Carlos

1

2012.03.22

例6:通过 path 将嵌套成交字段和根对象中的接收时间读入同一行。

quoteJson = [
    '{"data":{"id":1,"price":10.1},"receivedTime":"2026.01.01 09:00:00.000"}',
    '{"data":{"id":2,"price":10.2},"receivedTime":"2026.01.01 09:00:01.000"}'
]
quoteSchema = table(
    ["id", "price", "receivedTime"] as name,
    ["LONG", "DOUBLE", "TIMESTAMP"] as type,
    ["data.id", "data.price", "receivedTime"] as path
)
parseJsonTable(json=quoteJson, schema=quoteSchema)
id price receivedTime

1

10.1

2026.01.01T09:00:00.000

2

10.2

2026.01.01T09:00:01.000

例7:提取根字段和 columnsAfter 中的持仓字段,忽略 columnsBefore,并通过 format 指定日期字符串的格式。

positionJson = '{"OWNER":"TRADE","operType":"U","columnsAfter":{"L_DATE":"20250604","L_UNIT_ID":690792,"L_CURRENT_AMOUNT":5000},"columnsBefore":{"L_DATE":"20250603","L_UNIT_ID":690792,"L_CURRENT_AMOUNT":4500}}'
positionSchema = table(
    ["owner", "operation", "positionDate", "unitId", "amount"] as name,
    ["STRING", "STRING", "DATE", "LONG", "LONG"] as type,
    ["", "", "yyyyMMdd", "", ""] as format,
    ["OWNER", "operType", "columnsAfter.L_DATE", "columnsAfter.L_UNIT_ID", "columnsAfter.L_CURRENT_AMOUNT"] as path
)
parseJsonTable(json=positionJson, schema=positionSchema)
owner operation positionDate unitId amount

TRADE

U

2025.06.04

690792

5000

例8:将买卖五档价格按档位顺序组成数组向量,缺失的买二价格保留为 NULL。

depthJson = '{"stock_code":"IF2403","buy_order_book":{"buy_first_price":3598.8,"buy_third_price":3598.4,"buy_fourth_price":3598.2,"buy_fifth_price":3598.0},"sell_order_book":{"sell_first_price":3599.0,"sell_second_price":3599.2,"sell_third_price":3599.4,"sell_fourth_price":3599.6,"sell_fifth_price":3599.8}}'
buyPricePaths = [
    "buy_order_book.buy_first_price",
    "buy_order_book.buy_second_price",
    "buy_order_book.buy_third_price",
    "buy_order_book.buy_fourth_price",
    "buy_order_book.buy_fifth_price"
]
sellPricePaths = [
    "sell_order_book.sell_first_price",
    "sell_order_book.sell_second_price",
    "sell_order_book.sell_third_price",
    "sell_order_book.sell_fourth_price",
    "sell_order_book.sell_fifth_price"
]
depthPaths = ("stock_code", buyPricePaths, sellPricePaths)
depthSchema = table(
    ["stockCode", "buyPrice", "sellPrice"] as name,
    ["STRING", "DOUBLE[]", "DOUBLE[]"] as type,
    depthPaths as path
)
parseJsonTable(json=depthJson, schema=depthSchema)
stockCode buyPrice sellPrice

IF2403

[3598.8, NULL, 3598.4, 3598.2, 3598.0]

[3599.0, 3599.2, 3599.4, 3599.6, 3599.8]

例9:读取数组元素和名称含点号的嵌套键。

orderJson = '{"orderId":"A001","items":[{"price":10.5},{"price":12.0}],"data.id":{"child.value":3}}'
orderSchema = table(
    ["orderId", "firstPrice", "nestedValue"] as name,
    ["STRING", "DOUBLE", "INT"] as type,
    ["orderId", "items[0].price", '["data.id"]["child.value"]'] as path
)
parseJsonTable(json=orderJson, schema=orderSchema)
orderId firstPrice nestedValue

A001

10.5

3

例10:处理字段缺失、JSON null、类型转换失败和数组下标越界。空白单元格表示 NULL。

statusJson = '{"orderId":"A001","data":{"price":null,"quantity":"unknown"},"items":[{"price":10.5}]}'
statusSchema = table(
    ["orderId", "missingPrice", "nullPrice", "invalidQuantity", "outOfRangePrice"] as name,
    ["STRING", "DOUBLE", "DOUBLE", "DOUBLE", "DOUBLE"] as type,
    ["orderId", "data.missingPrice", "data.price", "data.quantity", "items[1].price"] as path
)
parseJsonTable(json=statusJson, schema=statusSchema)
orderId missingPrice nullPrice invalidQuantity outOfRangePrice

A001