本文介绍 JSON 函数的基本语法及示例。
日志服务支持如下 JSON 函数。
-
在日志服务分析语句中,表示字符串的字符必须使用单引号('')包裹,无符号包裹或被双引号("")包裹的字符表示字段名或列名。例如:
'status'表示字符串 status,status或"status"表示日志字段 status。 -
如果日志字段的值为 JSON 类型且需要展开为多行,请使用 unnest 语法。更多信息,请参见 UNNEST 子句 。
-
如果字符串被解析成 JSON 类型失败,则返回 null。
-
如果在采集过程中,JSON 日志被截断,则在使用 JSON 函数进行查询与分析时,系统将报错且中止查询与分析。针对该错误,您可以使用 TRY 表达式捕获异常信息,使得系统继续执行查询和分析操作。例如
* | select message, try(json_parse(message))。更多信息,请参见 TRY 表达式 。
|
函数名称 |
语法 |
说明 |
支持 SQL |
支持 SPL |
|
json_array_contains( x , value ) |
判断 JSON 数组中是否包含某个值。 |
√ |
√ |
|
|
json_array_get( x , index ) |
获取 JSON 数组中某个下标对应的元素。 |
√ |
× |
|
|
json_array_length( x ) |
计算 JSON 数组中元素的数量。 |
√ |
√ |
|
|
json_extract( x , json_path) |
从 JSON 对象或 JSON 数组中提取一组 JSON 值(数组或对象)。 |
√ |
√ |
|
|
json_extract_scalar( x , json_path ) |
从 JSON 对象或 JSON 数组中提取一组标量值(字符串、整数或布尔值)。类似于 json_extract 函数。 |
√ |
√ |
|
|
json_extract_bool(x, json_path) |
从 JSON 对象或 JSON 数组中提取 boolean 值。 |
√ |
× |
|
|
json_extract_long(x, json_path) |
从 JSON 对象或 JSON 数组中提取 bigint 值。 |
√ |
× |
|
|
json_extract_double(x, json_path) |
从 JSON 对象或 JSON 数组中提取 double 值。 |
√ |
× |
|
|
json_format( x ) |
把 JSON 类型转换为字符串类型。 |
√ |
√ |
|
|
json_parse( x ) |
把字符串类型转换为 JSON 类型。 |
√ |
√ |
|
|
json_size( x , json_path ) |
计算 JSON 对象或数组中元素的数量。 |
√ |
√ |
|
|
json_object_flatten(x) |
将 JSON 对象压缩为单层键值结构。 |
√ |
× |
json_array_contains 函数
json_array_contains 函数用于判断 JSON 数组中是否包含某个值。
语法
json_array_contains(x, value)
参数说明
|
参数 |
说明 |
|
x |
参数值为 JSON 数组。 |
|
value |
数值。 |
返回值类型
boolean 类型。
示例
判断 JSON 数组[1, 2, 3]中是否包含 2。
-
查询和分析语句( 调试 )
* | SELECT json_array_contains('[1, 2, 3]', 2) -
查询和分析结果
json_array_get 函数
json_array_get 函数用于获取 JSON 数组下标对应的元素。
语法
json_array_get(x, index)
参数说明
|
参数 |
说明 |
|
x |
参数值为 JSON 数组。 |
|
index |
JSON 下标,从 0 开始。 |
返回值类型
varchar 类型。
示例
返回 JSON 数组["a", [3, 9], "c"]下标为 1 的元素。
-
查询和分析语句( 调试 )
* | SELECT json_array_get('["a", [3, 9], "c"]', 1) -
查询和分析结果
json_array_length 函数
json_array_length 函数用于计算 JSON 数组中元素的数量。
语法
json_array_length(x)
参数说明
|
参数 |
说明 |
|
x |
参数值为 JSON 数组。 |
返回值类型
bigint 类型。
示例
-
示例 1:计算 Results 字段值中 JSON 元素的数量。
-
字段样例
Results:[{"EndTime":1626314920},{"FireResult":2}] -
查询和分析语句
* | SELECT json_array_length(Results) -
查询和分析结果
-
-
示例 2:计算 time 字段值中 JSON 元素的数量。
-
字段样例
time:["time_local","request_time","upstream_response_time"] -
查询和分析语句
* | SELECT json_array_length(time) -
查询和分析结果
-
json_extract 函数
json_extract 函数用于从 JSON 对象或 JSON 数组中提取一组 JSON 值(数组或对象)。
针对非法的 JSON 类型,json_extract 函数会报错,建议您使用 json_extract_scalar 函数。
语法
json_extract(x, json_path)
参数说明
|
参数 |
说明 |
|
x |
参数值为 JSON 对象或 JSON 数组。 |
|
json_path |
JSON 路径,格式为$.store.book[0].title。更多信息,请参见 如何设置 json_path 。 |
返回值类型
JSON 格式的 string 类型。
示例
SQL
获取
Results
字段中
EndTime
字段的值。
-
字段样例
Results:[{"EndTime":1626314920},{"FireResult":2}] -
查询和分析语句
* | SELECT json_extract(Results, '$.0.EndTime') -
查询和分析结果
SPL
获取
Results
字段中
EndTime
字段的值。
-
字段样例
Results:[{"EndTime":1626314920},{"FireResult":2}]
-
SPL 语句
* | extend a = json_extract(Results, '$.0.EndTime')
-
SPL 结果
json_extract_scalar 函数
json_extract_scalar 函数用于从 JSON 对象或 JSON 数组中提取一组标量值(字符串、整数或布尔值)。
语法
json_extract_scalar(x, json_path)
参数说明
|
参数 |
说明 |
|
x |
参数值为 JSON 对象或 JSON 数组。 |
|
json_path |
JSON 路径,格式为$.store.book[0].title。更多信息,请参见 如何设置 json_path 。 |
返回值类型
varchar 类型。
示例
SQL
从
Results
字段中获取
RawResultCount
字段的值,并将该值转换为
bigint
类型进行求和。
-
字段样例
Results:[{"EndTime":1626314920},{"RawResultCount":1}] -
查询和分析语句
* | SELECT sum(cast(json_extract_scalar(Results,'$.1.RawResultCount') AS bigint) ) -
查询和分析结果
SPL
从
Results
字段中获取
RawResultCount
字段的值。
-
字段样例
Results:[{"EndTime":1626314920},{"RawResultCount":1}]
-
SPL 语句
* | extend a = json_extract_scalar(Results, '$.1.RawResultCount')
-
SPL 结果
json_extract_bool 函数
json_extract_bool
函数用于从
JSON
对象或
JSON
数组中提取
boolean
值,提取失败返回
null
。
语法
json_extract_bool(x, json_path)
参数说明
|
参数 |
说明 |
|
x |
参数值为 JSON 类型。 |
|
json_path |
JSON 路径,格式为$.store.book[0].title。更多信息,请参见 如何设置 json_path 。 |
返回值类型
boolean 类型。
示例
从
JSON
数组
Results
中提取
boolean
值。
-
字段样例
Results:[{"ret":true},{"status":FALSE}] -
查询和分析语句
* | SELECT json_extract_bool(Results, '$.0.ret') -
查询和分析结果
json_extract_long 函数
json_extract_long
函数用于从
JSON
对象或
JSON
数组中提取
bigint
值,提取失败返回
null
。
语法
json_extract_long(x, json_path)
参数说明
|
参数 |
说明 |
|
x |
参数值为 JSON 类型。 |
|
json_path |
JSON 路径,格式为$.store.book[0].title。更多信息,请参见 如何设置 json_path 。 |
返回值类型
bigint 类型。
示例
从
JSON
数组
Results
中提取
bigint
值。
-
字段样例
Results:[{"EndTime":1626314920},{"FireResult":2}] -
查询和分析语句
* | SELECT json_extract_long(Results, '$.0.EndTime') -
查询和分析结果
json_extract_double 函数
json_extract_double
函数用于从
JSON
对象或
JSON
数组中提取
double
值,提取失败返回
null
。
语法
json_extract_double(x, json_path)
参数说明
|
参数 |
说明 |
|
x |
参数值为 JSON 类型。 |
|
json_path |
JSON 路径,格式为$.store.book[0].title。更多信息,请参见 如何设置 json_path 。 |
返回值类型
double 类型。
示例
从
JSON
数组
Results
中提取
double
值。
-
字段样例
Results:[{"EndTime":1626314920},{"FireResult":2}] -
查询和分析语句
* | SELECT json_extract_double(Results, '$.0.EndTime') -
查询和分析结果
json_format 函数
json_format 函数用于将 JSON 类型转化成字符串类型。
语法
json_format(x)
参数说明
|
参数 |
说明 |
|
x |
参数值为 JSON 类型。 |
返回值类型
varchar 类型。
示例
将 JSON 数组[1,2,3]转换为字符串[1, 2, 3]。
-
查询和分析语句( 调试 )
* | SELECT json_format(json_parse('[1, 2, 3]')) -
查询和分析结果
json_parse 函数
json_parse 函数只用于将字符串类型转化成 JSON 类型,判断是否符合 JSON 格式。一般情况下,json_parse 函数使用意义不大,如果您需要从 JSON 中提取值,建议使用 json_extract_scalar 函数。
语法
json_parse(x)
参数说明
|
参数 |
说明 |
|
x |
参数值为字符串。 |
返回值类型
JSON 类型。
示例
SQL
SPL
将字符串
[1,2,3]
转换为
JSON
数组
[1, 2, 3]
。
-
SPL 语句
* | extend a = json_parse('[1, 2, 3]')
-
SPL 结果
json_size 函数
json_size 函数用于计算 JSON 对象或 JSON 数组中元素的数量。
语法
json_size(x, json_path)
参数说明
|
参数 |
说明 |
|
x |
参数值为 JSON 对象或 JSON 数组。 |
|
json_path |
JSON 路径,格式为$.store.book[0].title。更多信息,请参见 如何设置 json_path 。 |
返回值类型
bigint 类型。
示例
返回
status
字段中元素的数量。
-
字段样例
Results:[{"EndTime":1626314920,"FireResult":2,"RawResults":[{"_col0":"1094"}]}] -
查询和分析语句
* | SELECT json_size(Results, '$.0.RawResults') -
查询和分析结果
json_object_flatten 函数
json_object_flatten 函数用于将 JSON 对象压缩为单层键值结构。
语法
json_object_flatten(x)
参数说明
|
参数 |
说明 |
|
x |
参数值为 JSON 类型。如果 JSON 对象非 Object,则返回 null。 |
返回值类型
map(varchar, varchar)类型。
示例
将 content 字段 JSON 内容压缩为 1 层键值对。
-
字段样例
content: '{"Time":1626314920,"Info":[{"count":"1"}],"Body":"this is test"}' -
查询和分析语句
select json_object_flatten(content) as data from (values '{"Time":1626314920,"Info":[{"count":"1"}],"Body":"this is test"}') t (content) limit 1; -
输出数据