本文介紹JSON函數的基本文法及樣本。
Log Service支援如下JSON函數。
-
在Log Service分析語句中,表示字串的字元必須使用單引號('')包裹,無符號包裹或被雙引號("")包裹的字元表示欄位名或列名。例如:
'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) -
查詢和分析結果為true,表示JSON數組[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) -
查詢和分析結果為[3,9]。
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。
-
-
樣本2:計算time欄位值中JSON元素的數量。
-
欄位範例
time:["time_local","request_time","upstream_response_time"] -
查詢和分析語句
* | SELECT json_array_length(time) -
查詢和分析結果為3。
-
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') -
查詢和分析結果為1626314920。
SPL
擷取Results欄位中EndTime欄位的值。
-
欄位範例
Results:[{"EndTime":1626314920},{"FireResult":2}]
-
SPL語句
* | extend a = json_extract(Results, '$.0.EndTime')
-
SPL結果
返回結果中,欄位a的值為1626314920。
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) ) -
查詢和分析結果為288。
SPL
從Results欄位中擷取RawResultCount欄位的值。
-
欄位範例
Results:[{"EndTime":1626314920},{"RawResultCount":1}]
-
SPL語句
* | extend a = json_extract_scalar(Results, '$.1.RawResultCount')
-
SPL結果中,欄位a的值為1。
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') -
查詢和分析結果
返回結果為true。
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') -
查詢和分析結果
返回結果為1626314920。
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') -
查詢和分析結果
返回結果為1626314920.0。
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]')) -
查詢和分析結果為[1,2,3]。
json_parse函數
json_parse函數只用於將字串類型轉化成JSON類型,判斷是否符合JSON格式。一般情況下,json_parse函數使用意義不大,如果您需要從JSON中提取值,建議使用json_extract_scalar函數。
文法
json_parse(x)
參數說明
|
參數 |
說明 |
|
x |
參數值為字串。 |
傳回值類型
JSON類型。
樣本
SQL
-
樣本1
將字串[1,2,3]轉換為JSON數組[1, 2, 3]。
-
查詢和分析語句(調試)
* | SELECT json_parse('[1, 2, 3]') -
查詢和分析結果為[1,2,3]。
-
-
樣本2
提取
logging欄位中的各個子欄位。-
欄位範例如下,logging欄位為JSON對象,包含message、processName、thread、threadName、module、funcName、levelName、process等索引值對。
-
查詢和分析語句(調試)
*| SELECT map_keys(try_cast(json_parse(logging) AS map(varchar, json))) -
查詢和分析結果為["funcName","levelname","message","module","process","processName","thread","threadName"]。
-
SPL
將字串[1,2,3]轉換為JSON數組[1, 2, 3]。
-
SPL語句
* | extend a = json_parse('[1, 2, 3]')
-
SPL結果
返回結果中,欄位a的值為[1, 2, 3]。
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') -
查詢和分析結果為1。
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; -
輸出資料
如下,data欄位的值為{"Time":"1626314920","Info":"[{\"count\":\"1\"}]","Body":"this is test"},即原始JSON對象已被壓縮為單層索引值結構。