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 时必须指定该列。取值规则如下:
|
字段路径从 JSON 最外层对象开始。下表中的键名均为示意名称,使用时替换为实际键名;index 为从 0 开始的数组下标。
| 通用写法 | 含义 |
|---|---|
|
key |
读取根对象的 key 字段。 |
|
|
读取 parent 对象的 child 字段,点号分隔对象层级。 |
|
|
读取 array 数组中指定下标的元素。 |
|
|
读取 array 数组中指定元素的 child 字段。 |
|
|
读取完整键名为 key.name 的字段。 |
|
|
读取完整键名为 key.name 的对象中的 child 字段。 |
|
|
依次访问 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 |
