本文介紹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_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')
查詢和分析結果