GET_JSON_OBJECT 関数は、指定された JSON パス (json_path) に基づいて、JSON 文字列または JSON 型の値から文字列を抽出します。
構文
STRING GET_JSON_OBJECT(JSON|STRING <json>, STRING <json_path>)
-- 例:Alice を返します。
SELECT GET_JSON_OBJECT(JSON '{"name": "Alice", "age": 30}', '$.name');
使用上の注意
-
GET_JSON_OBJECT関数は、JSON パスでの正規表現構文をサポートしていません。 -
新しい JSON データ型 の JSON パス構文は、元の仕様とは異なります。これにより、互換性の問題が発生する可能性があります。
-
クエリに同じ JSON データを処理する複数の GET_JSON_OBJECT 関数が含まれている場合、関数は同じ JSON 文字列を繰り返し解析します。これはパフォーマンスに悪影響を与え、コストを増加させる可能性があります。これを回避するには、
GET_JSON_OBJECTをユーザー定義テーブル値関数 (UDTF) と組み合わせて使用し、JSON ログデータを変換できます。
引数
-
json:必須。処理する JSON データ。このパラメーターは、JSON と STRING の 2 つの入力型をサポートします。
-
JSON 型:JSON 型の値。値は
{"Key":"Value", "Key":"Value",...}の形式である必要があります (例:JSON '{"name": "Alice", "age": 30}')。 -
STRING 型:入力が STRING の場合、次の形式要件を満たす必要があります:
-
文字列は
'{"Key":"Value", "Key":"Value",...}'の形式である必要があります (例:'{"name": "Alice", "age": 30}')。 -
二重引用符 (") は、2 つのバックスラッシュ (\\) でエスケープする必要があります。
-
一重引用符 (') は、1 つのバックスラッシュ (\\) でエスケープする必要があります。
-
-
-
json_path:必須。データの抽出に使用される JSON パス式を指定する STRING。パスは
$文字で始まる必要があります (例:$.aliyun.test[0].demo)。パス式では、次の文字を使用します:-
$:ルートノードを示します。 -
.または['']:子ノードを示します。これは JSON オブジェクトの解析に使用します (例:$.store.book)。JSON キーにピリオド (.) が含まれている場合は、代わりに['']を使用できます。['']を使用したデータの抽出は、SET odps.sql.udf.getjsonobj.new=true;ステートメントを実行した場合にのみサポートされます。 -
[]:[number]は配列の添え字を示します。添え字は 0 から始まります。 -
*:[]のワイルドカード文字。配列全体を返します。アスタリスク (*) はエスケープできません。
-
戻り値
STRING 型の値を返します。この値は、指定されたパスから抽出されたデータです。この関数の戻り値は、次のルールに従います:
-
json が有効で、json_path が存在する場合、対応する文字列が返されます。
-
json が空または無効な形式の場合、NULL が返されます。
-
json_path に
[*]が含まれている場合、戻り値は配列形式ではありません。戻り値を統一された配列形式にするには、SET odps.sql.force.getjsonobj.array.format=true;ステートメントを実行してください。 -
json_path が無効な場合、NULL が返されます。
戻り値の動作
-
次のコマンドでプロジェクトレベルまたはセッションレベルのフラグを設定することで、関数の戻り値の動作を制御できます:
SET odps.sql.udf.getjsonobj.new=true/false;。フラグ設定の違いに対応する 2 つの戻り値の動作は次のとおりです:
重要SET odps.sql.udf.getjsonobj.new=true;の設定を使用することを推奨します。この設定は、より標準的な関数の動作を提供し、データ処理を簡素化し、パフォーマンスを向上させます。 お使いの MaxCompute プロジェクトに、JSON 予約文字をエスケープする動作に依存する既存のジョブがある場合は、元の動作を引き続き使用することを推奨します。これにより、検証なしで新しい動作に切り替えた場合に発生する可能性のあるエラーや正確性の問題を回避できます。パラメーター設定
SET odps.sql.udf.getjsonobj.new=true;SET odps.sql.udf.getjsonobj.new=false;戻り値の動作
元の文字列を修正せずにそのまま出力します。
JSON 予約文字をエスケープして文字列を出力します。
戻り値は直接解析できる JSON 文字列です。
REPLACEやREGEXP_REPLACEなどの関数を使用してバックスラッシュを置換する必要はありません。改行文字 (\n) や引用符 (") などの JSON 予約文字は、文字列
'\n'および'\"'として返されます。重複キーの解析
JSON オブジェクトに重複キーが含まれていても、正常に解析できます。
-- 2 を返します。 SELECT GET_JSON_OBJECT('{"a":"1","a":"2"}', '$.a');JSON オブジェクトに重複キーを含めることはできません。含まれている場合、解析が失敗する可能性があります。
-- NULL を返します。 SELECT GET_JSON_OBJECT('{"a":"1","a":"2"}', '$.a');出力のソート順
出力は、元の JSON 文字列と同じ順序でソートされます。
-- {"b":"1","a":"2"} を返します。 SELECT GET_JSON_OBJECT('{"b":{"b":"1","a":"2"},"a":"2"}', '$.b');出力はアルファベット順にソートされます。
-- {"a":"2","b":"1"} を返します。 SELECT GET_JSON_OBJECT('{"b":{"b":"1","a":"2"},"a":"2"}', '$.b'); -
SET odps.sql.hive.compatible=true;コマンドを実行して Hive 互換モードを有効にすると、GET_JSON_OBJECT関数は戻り値として元の文字列を保持します。 -
2021 年 1 月 21 日以降 に作成された MaxCompute プロジェクトの場合、
GET_JSON_OBJECT関数のデフォルトの戻り値の動作は、元の文字列を保持することです。 -
2021 年 1 月 21 日以前 に作成された MaxCompute プロジェクトの場合、
GET_JSON_OBJECT関数のデフォルトの戻り値の動作は、JSON 予約文字をエスケープすることです。 -
次の例を使用して、お使いの MaxCompute プロジェクトで
GET_JSON_OBJECT関数がどちらの動作をするかを確認できます。これを行うには、次のコマンドを実行してください:SELECT GET_JSON_OBJECT('{"a":"[\\"1\\"]"}', '$.a'); -- JSON 予約文字をエスケープする動作の場合の戻り値: [\"1\"] -- 元の文字列を保持する動作の場合の戻り値: ["1"]プロジェクトの
GET_JSON_OBJECT関数のデフォルトの戻り値の動作を元の文字列の保持に切り替えるには、チケットを起票してください。これにより、セッションごとにセッションレベルでプロパティを設定する必要がなくなります。
例
JSON 入力パラメーター
例 1:JSON データからの特定キーの値の取得
-- 1 を返します。
SELECT GET_JSON_OBJECT(JSON '{"a":1, "b":2}', '$.a');
-- NULL を返します。
SELECT GET_JSON_OBJECT(JSON '{"a":1, "b":2}', '$.c');
例 2:無効な json_path
-- NULL を返します。
SELECT GET_JSON_OBJECT(JSON '{"a":1, "b":2}', '$invalid_json_path');
STRING 入力パラメーター
例 1:src_json.json JSON オブジェクトからの情報抽出
-- テストデータを準備します。
CREATE TABLE IF NOT EXISTS src_json (
json STRING
);
INSERT OVERWRITE TABLE src_json
VALUES
('{"store":
{"fruit":[{"weight":8,"type":"apple"},
{"weight":9,"type":"pear"}],
"bicycle":{"price":19.95,
"color":"red"}},
"email":"amy@only_for_json_udf_test.net",
"owner":"amy"}');
-- owner フィールドの情報を抽出します。戻り値は amy です。
SELECT GET_JSON_OBJECT(src_json.json, '$.owner') FROM src_json;
-- オプション。元の文字列を保持して出力します。
SET odps.sql.udf.getjsonobj.new=true;
-- store.fruit フィールドの最初の配列の情報を抽出します。戻り値は {"weight":8,"type":"apple"} です。
SELECT GET_JSON_OBJECT(src_json.json, '$.store.fruit[0]') FROM src_json;
-- 存在しないフィールドの情報を抽出します。戻り値は NULL です。
SELECT GET_JSON_OBJECT(src_json.json, '$.non_exist_key') FROM src_json;
例 2:JSON 配列データからの情報抽出
-- 2222 を返します。
SELECT GET_JSON_OBJECT('{"array":[["aaaa",1111],["bbbb",2222],["cccc",3333]]}','$.array[1][1]');
-- 元の文字列を保持して出力します。
SET odps.sql.udf.getjsonobj.new=true;
-- ["h0","h1","h2"] を返します。
SELECT GET_JSON_OBJECT('{"aaa":"bbb","ccc":{"ddd":"eee","fff":"ggg","hhh":["h0","h1","h2"]},"iii":"jjj"}','$.ccc.hhh[*]');
-- JSON 予約文字をエスケープして出力します。
SET odps.sql.udf.getjsonobj.new=false;
-- [\"h0\",\"h1\",\"h2\"] を返します。
SELECT GET_JSON_OBJECT('{"aaa":"bbb","ccc":{"ddd":"eee","fff":"ggg","hhh":["h0","h1","h2"]},"iii":"jjj"}','$.ccc.hhh[*]');
-- h1 を返します。
SELECT GET_JSON_OBJECT('{"aaa":"bbb","ccc":{"ddd":"eee","fff":"ggg","hhh":["h0","h1","h2"]},"iii":"jjj"}','$.ccc.hhh[1]');
例 3:ピリオド (.) を含むキーを持つ JSON データからの情報抽出
-- テストデータを準備します。
CREATE TABLE json_test (id STRING, json STRING);
-- キーにピリオド (.) を含むデータを挿入します。
INSERT INTO TABLE json_test (id, json) VALUES
("1",
"{
\"China.beijing\":
{\"school\":
{\"id\":0,\"book\":
[{\"title\": \"A\",\"price\": 8.95},
{\"title\": \"B\",\"price\": 10.2}]
}
}
}"
);
-- キーにピリオド (.) を含まないデータを挿入します。
INSERT INTO TABLE json_test (id, json) VALUES
("2",
"{
\"China_beijing\":
{\"school\":
{\"id\":0,\"book\":
[{\"title\": \"A\",\"price\": 8.95},
{\"title\": \"B\",\"price\": 10.2}]
}
}
}"
);
-- 角括弧 [''] を使用して、ピリオド (.) を含むデータを解析します。
-- これにより、'China.beijing' の 'id' の値が抽出されます。戻り値は 0 です。
SELECT GET_JSON_OBJECT(json, "$['China.beijing'].school['id']") FROM json_test WHERE id =1;
-- 特殊文字を含まないデータの場合、'.' と [''] の両方が有効で同等です。
-- これにより、'China_beijing' の 'id' の値が抽出されます。戻り値は 0 です。
SELECT GET_JSON_OBJECT(json, "$['China_beijing'].school['id']") FROM json_test WHERE id =2;
SELECT GET_JSON_OBJECT(json, "$.China_beijing.school['id']") FROM json_test WHERE id =2;
例 4:ピリオド (.) を含むキーに対する [''] の使用
SET odps.sql.udf.getjsonobj.new=true;
-- 1 を返します。
SELECT GET_JSON_OBJECT('{"a.1":"1","a":"2"}', '$[\'a.1\']');
例 5:空または無効な JSON 入力
-- NULL を返します。
SELECT GET_JSON_OBJECT('','$.array[1][1]');
-- NULL を返します。
SELECT GET_JSON_OBJECT('"array":["aaaa",1111],"bbbb":["cccc",3333]','$.array[1][1]');
例 6:エスケープされた JSON 文字列
SET odps.sql.udf.getjsonobj.new=true;
-- "1" を返します。
SELECT GET_JSON_OBJECT('{"a":"\\"1\\"","b":"2"}', '$.a');
-- '1' を返します。
SELECT GET_JSON_OBJECT('{"a":"\'1\'","b":"2"}', '$.a');
例 7:絵文字のサポート
-- 絵文字記号を返します。
SELECT GET_JSON_OBJECT('{"a":"<Emoji symbol>"}', '$.a');
注: DataWorks は絵文字の直接入力をサポートしていません。Data Integration などのツールを使用して、絵文字に対応するエンコードされた文字列を MaxCompute に書き込むことができます。その後、GET_JSON_OBJECT 関数を使用してそれらを処理できます。
関連関数
-
関連する関数の詳細については、「JSON 関数」をご参照ください。
-
ベストプラクティスについては、「OSS から MaxCompute への JSON データの移行」をご参照ください。
-
json_path の詳細については、「LanguageManual UDF」をご参照ください。