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