このトピックでは、JSON 関数の基本的な構文と例について説明します。
SLS は、次の JSON 関数をサポートしています。
-
Log Service のクエリ文では、文字列をシングルクォーテーション (') で囲みます。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_bool(x, json_path) |
JSON オブジェクトまたは JSON 配列からブール値を抽出します。 |
√ |
× |
|
|
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 オブジェクト内のキーと値のペアの数を返します。 |
√ |
√ |
|
|
json_object_flatten(x) |
JSON オブジェクトを単一層のキーと値の構造にフラット化します。 |
√ |
× |
Json_array_contains
json_array_contains 関数は、JSON 配列に特定の値が含まれているかどうかを確認します。
構文
json_array_contains(x, value)
パラメーター
|
パラメーター |
説明 |
|
x |
JSON 配列。 |
|
value |
JSON 配列内で検索する値。 |
戻り値の型
boolean
例
JSON 配列 [1, 2, 3] に値 2 が含まれているかどうかを確認します。
-
クエリ文 (テスト)
* | SELECT json_array_contains('[1, 2, 3]', 2) -
JSON 配列 [1, 2, 3] に 2 が含まれているため、クエリは true を返します。
json_array_get 関数
JSON 配列内の指定されたインデックスにある要素を返します。
構文
json_array_get(x, index)
パラメーター
|
パラメーター |
説明 |
|
x |
JSON 配列。 |
|
index |
0 から始まる要素のインデックス。 |
戻り値の型
varchar
例
JSON 配列 ["a", [3, 9], "c"] からインデックス 1 の要素を返します。
-
クエリ文 (テスト)
* | SELECT json_array_get('["a", [3, 9], "c"]', 1) -
クエリ結果は [3,9] です。
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 値を抽出します。
json_extract 関数は、無効な JSON 型に対してエラーを返します。代わりに json_extract_scalar 関数を使用してください。
構文
json_extract(x, json_path)
パラメーター
|
パラメーター |
説明 |
|
x |
JSON オブジェクトまたは JSON 配列。 |
|
json_path |
|
戻り値の型
JSON 形式の文字列。
例
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 の結果
結果には、1626314920 に設定されたフィールド a が含まれます。
json_extract_scalar
json_extract_scalar 関数は、JSON オブジェクトまたは JSON 配列からスカラー値 (文字列、整数、またはブール値) を抽出します。
構文
json_extract_scalar(x, json_path)
パラメーター
|
パラメーター |
説明 |
|
x |
JSON オブジェクトまたは JSON 配列。 |
|
json_path |
$.store.book[0].title などの JSON パス。詳細については、「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')
-
a フィールドの値は 1 です。
json_extract_bool
JSON オブジェクトまたは JSON 配列からブール値を抽出します。抽出に失敗した場合は null を返します。
構文
json_extract_bool(x, json_path)
パラメーター
|
パラメーター |
説明 |
|
x |
JSON オブジェクトまたは JSON 配列。 |
|
json_path |
$.store.book[0].title などの JSON パス。詳細については、「json_path の設定」をご参照ください。 |
戻り値の型
boolean
例
Results JSON 配列からブール値を抽出します。
-
フィールドのサンプル
Results:[{"ret":true},{"status":FALSE}] -
クエリ文
* | SELECT json_extract_bool(Results, '$.0.ret') -
クエリ結果
クエリは true を返します。
json_extract_long
JSON オブジェクトまたは JSON 配列から bigint 値を抽出します。抽出に失敗した場合は null を返します。
構文
json_extract_long(x, json_path)
パラメーター
|
パラメーター |
説明 |
|
x |
JSON 値。 |
|
json_path |
$.store.book[0].title などの JSON パス。詳細については、「json_path の設定」をご参照ください。 |
戻り値
bigint
例
この例では、Results JSON 配列から bigint 値を抽出します。
-
フィールドのサンプル
Results:[{"EndTime":1626314920},{"FireResult":2}] -
クエリ文
* | SELECT json_extract_long(Results, '$.0.EndTime') -
クエリ結果
1626314920 を返します。
Json_extract_double
JSON オブジェクトまたは JSON 配列から double 値を抽出します。抽出に失敗した場合は null を返します。
構文
json_extract_double(x, json_path)
パラメーター
|
パラメーター |
説明 |
|
x |
JSON オブジェクトまたは JSON 配列。 |
|
json_path |
$.store.book[0].title などの JSON パス。詳細については、「json_path の設定方法」をご参照ください。 |
戻り値の型
double
例
Results JSON 配列から 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_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フィールドからキーを抽出します。-
この例では、message、processName、thread、threadName、module、funcName、levelname、process などのキーと値のペアを含む JSON オブジェクトである
loggingフィールドを処理します。 -
クエリ文 (テスト)
*| 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 |
$.store.book[0].title などの JSON パス。詳細については、「json_path の設定」をご参照ください。 |
戻り値の型
bigint
例
この例では、RawResults フィールドの要素数を計算します。
-
フィールドのサンプル
Results:[{"EndTime":1626314920,"FireResult":2,"RawResults":[{"_col0":"1094"}]}] -
クエリ文
* | SELECT json_size(Results, '$.0.RawResults') -
クエリ結果は 1 です。
json_object_flatten 関数
JSON オブジェクトを単一層のキーと値の構造にフラット化します。
構文
json_object_flatten(x)
パラメーター
|
パラメーター |
説明 |
|
x |
フラット化する JSON 値を指定します。入力が JSON オブジェクトでない場合、関数は null を返します。 |
戻り値の型
map(varchar, varchar)
例
'content' フィールドの JSON オブジェクトを単一層のキーと値の構造にフラット化します。
-
フィールドのサンプル
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 オブジェクトが単一層のキーと値の構造にフラット化されたことを示しています。