`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 文字列を繰り返し解析します。これはパフォーマンスに悪影響を与え、コストを増加させる可能性があります。これを回避するには、ユーザー定義のテーブル値関数 (UDTF) と
GET_JSON_OBJECTを使用して JSON ログデータを変換します。詳細については、「MaxCompute のビルトイン関数と 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 オブジェクトに重複キーが含まれていても、正常に解析できます。
-- 1 が返されます。 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 を返す
-- 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」をご参照ください。