Fungsi GET_JSON_OBJECT mengekstraksi string dari input JSON atau STRING menggunakan path JSON yang ditentukan json_path.
Sintaks Perintah
STRING GET_JSON_OBJECT(JSON|STRING <json>, STRING <json_path>)
-- Contoh khas, mengembalikan Alice.
SELECT GET_JSON_OBJECT(JSON '{"name": "Alice", "age": 30}', '$.name');
Catatan Penting
-
GET_JSON_OBJECTtidak mendukung sintaks ekspresi reguler dalam JSON PATH. -
Tipe data JSON baru memiliki spesifikasi JSON PATH yang berbeda dari spesifikasi sebelumnya, sehingga mungkin terjadi masalah kompatibilitas.
-
Jika sebuah query berisi beberapa fungsi
GET_JSON_OBJECTyang memproses data JSON yang sama, fungsi tersebut akan melakukan penguraian berulang terhadap string JSON yang sama. Pemanggilan berulang ini dapat memengaruhi performa dan menimbulkan biaya tambahan. Anda dapat menghindari pemanggilan berulang dengan menggabungkan UDTF untuk mengonversi data log berformat JSON. Untuk informasi selengkapnya, lihat Menggunakan Fungsi Bawaan MaxCompute dan UDTF untuk Mengonversi Data Log Berformat JSON. -
Jika nilai suatu bidang dasar merupakan string JSON yang telah di-escape beberapa kali, fungsi
GET_JSON_OBJECTakan memperlakukan seluruh nilai tersebut sebagai string biasa, gagal mengurai struktur JSON, dan mengembalikan NULL. Dalam kasus ini, Anda dapat menggunakan fungsi ekspresi reguler sepertiREGEXP_EXTRACT_ALLuntuk mengekstraksi nilai bidang yang diperlukan secara langsung dari string menggunakan ekspresi reguler.
Penjelasan Parameter
-
json: Wajib diisi. Data JSON yang akan diproses. Mendukung dua tipe input: JSON atau STRING:
-
JSONtype : Nilai bertipeJSON data type. Formatnya adalah{"Key":"Value", "Key":"Value",...}, contohnyaJSON '{"name": "Alice", "age": 30}'. -
Tipe STRING: Saat input bertipe STRING, format harus memenuhi persyaratan berikut:
-
Format untuk STRING adalah
{Key:Value, Key:Value,...}, contohnya'{"name": "Alice", "age": 30}'. -
Tanda kutip ganda Inggris (") harus di-escape dengan dua backslash (\\).
-
Tanda kutip tunggal Inggris (') harus di-escape dengan satu backslash (\).
-
-
-
json_path: Wajib diisi. Ekspresi path JSON untuk data yang ingin diekstraksi, dimulai dengan
$, bertipe STRING, contohnya$.aliyun.test[0].demo. Arti karakter berbeda adalah sebagai berikut:-
$: Menunjukkan node root. -
.atau['']: Menunjukkan node anak, digunakan untuk mengurai objek JSON, contohnya$.store.book. Jika Key JSON itu sendiri mengandung., Anda dapat menggunakan['']sebagai pengganti.Penggunaan
['']untuk mengambil data hanya didukung saat pernyataan FlagSET odps.sql.udf.getjsonobj.new=true;diaktifkan. -
[]:[number]menunjukkan indeks array, dimulai dari 0. -
*:Wildcard untuk [], mengembalikan seluruh array.*tidak mendukung escape.
-
Penjelasan Nilai Kembalian
Mengembalikan tipe STRING, yaitu data yang diekstraksi sesuai path yang ditentukan. Aturan pengembalian adalah sebagai berikut:
-
Jika json valid dan json_path ada, maka mengembalikan string yang sesuai.
-
Jika json kosong atau dalam format ilegal, mengembalikan NULL.
-
Jika json_path mengandung
[*], hasil kembaliannya bukan dalam format ARRAY. Jika Anda ingin memaksa pengembalian dalam format ARRAY yang konsisten, aturSET odps.sql.force.getjsonobj.array.format=true;. -
Jika json_path ilegal, mengembalikan NULL.
Penjelasan perilaku pengembalian:
-
Dukungan pengaturan melalui Flag tingkat
Project/Session:SET odps.sql.udf.getjsonobj.new=true/false;untuk mengontrol cara pengembalian fungsi.Pengaturan Flag yang berbeda menghasilkan dua perilaku pengembalian fungsi berikut:
PentingDisarankan menggunakan konfigurasi
SET odps.sql.udf.getjsonobj.new=true;karena perilaku pengembaliannya lebih standar, pengolahan datanya lebih mudah, dan performanya lebih baik.Jika proyek MaxCompute Anda memiliki job lama yang menggunakan perilaku escape karakter khusus JSON, disarankan mempertahankan perilaku aslinya untuk menghindari kesalahan atau masalah keakuratan akibat perubahan tanpa verifikasi.Pengaturan Parameter
SET odps.sql.udf.getjsonobj.new=true;SET odps.sql.udf.getjsonobj.new=false;Perilaku pengembalian fungsi
Menggunakan pendekatan mempertahankan string asli saat output.
Menggunakan pendekatan escape karakter khusus JSON saat output.
Nilai kembalian tetap berupa string JSON, sehingga dapat diurai lebih lanjut tanpa perlu menggunakan fungsi tambahan seperti
REPLACEatauREGEXP_REPLACEuntuk mengganti backslash.Karakter khusus JSON seperti newline (\n) dan tanda kutip (") ditampilkan sebagai string
'\n'dan'\"'.Parsing Kunci yang Sama
Objek JSON dapat memiliki Key yang sama dan tetap berhasil diurai.
-- Mengembalikan 1. SELECT GET_JSON_OBJECT('{"a":"1","a":"2"}', '$.a');Objek JSON tidak boleh memiliki Key yang sama, karena dapat menyebabkan kegagalan penguraian.
-- Mengembalikan NULL. SELECT GET_JSON_OBJECT('{"a":"1","a":"2"}', '$.a');Cara pengurutan hasil output
Hasil output mengikuti urutan asli dalam string JSON.
-- Mengembalikan {"b":"1","a":"2"}. SELECT GET_JSON_OBJECT('{"b":{"b":"1","a":"2"},"a":"2"}', '$.b');Hasil output diurutkan secara leksikografis (dictionary order).
-- Mengembalikan {"a":"2","b":"1"}. SELECT GET_JSON_OBJECT('{"b":{"b":"1","a":"2"},"a":"2"}', '$.b'); -
Saat mode kompatibilitas Hive diaktifkan dengan
SET odps.sql.hive.compatible=true;, perilaku pengembalian fungsiGET_JSON_OBJECTsecara paksa mempertahankan string asli. -
Untuk proyek MaxCompute yang dibuat pada atau setelah 21 Januari 2021, perilaku pengembalian fungsi
GET_JSON_OBJECTsecara default adalah mempertahankan string asli. -
Untuk proyek MaxCompute yang dibuat sebelum 21 Januari 2021, perilaku pengembalian fungsi
GET_JSON_OBJECTsecara default adalah escape karakter khusus JSON. -
Anda dapat menggunakan contoh berikut untuk menentukan perilaku pengembalian fungsi
GET_JSON_OBJECTdalam proyek MaxCompute Anda dengan menjalankan perintah berikut:SELECT GET_JSON_OBJECT('{"a":"[\\"1\\"]"}', '$.a'); -- Perilaku escape karakter khusus JSON mengembalikan: [\"1\"] -- Perilaku mempertahankan string asli mengembalikan: ["1"]Anda dapat menghubungi tim dukungan teknis produk melalui tiket dukungan untuk mengubah perilaku pengembalian fungsi
GET_JSON_OBJECTmenjadi mempertahankan string asli, sehingga tidak perlu sering mengatur properti di tingkat Session.
Contoh Penggunaan
Parameter Input Bertipe JSON
Contoh 1: Dari data bertipe JSON, ambil nilai value yang bersesuaian dengan key bernilai a dan key bernilai c.
-- Mengembalikan 1.
SELECT GET_JSON_OBJECT(JSON '{"a":1, "b":2}', '$.a');
-- Mengembalikan NULL.
SELECT GET_JSON_OBJECT(JSON '{"a":1, "b":2}', '$.c');
Contoh 2: Saatjson_pathilegal, mengembalikan NULL.
-- Mengembalikan NULL.
SELECT GET_JSON_OBJECT(JSON '{"a":1, "b":2}', '$invalid_json_path');
Parameter Input Bertipe STRING
Contoh 1: Ekstraksi informasi dari objek JSONsrc_json.json
-- Siapkan data uji.
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"}');
-- Ekstraksi informasi bidang owner, mengembalikan amy.
SELECT GET_JSON_OBJECT(src_json.json, '$.owner') FROM src_json;
-- Opsional, gunakan pendekatan mempertahankan string asli saat output.
SET odps.sql.udf.getjsonobj.new=true;
-- Ekstraksi informasi elemen pertama dari array store.fruit, mengembalikan {"weight":8,"type":"apple"}.
SELECT GET_JSON_OBJECT(src_json.json, '$.store.fruit[0]') FROM src_json;
-- Ekstraksi informasi bidang yang tidak ada, mengembalikan NULL.
SELECT GET_JSON_OBJECT(src_json.json, '$.non_exist_key') FROM src_json;
Contoh 2: Ekstraksi informasi dari data JSON bertipe array
-- Mengembalikan 2222.
SELECT GET_JSON_OBJECT('{"array":[["aaaa",1111],["bbbb",2222],["cccc",3333]]}','$.array[1][1]');
-- Gunakan pendekatan mempertahankan string asli saat output.
SET odps.sql.udf.getjsonobj.new=true;
-- Mengembalikan ["h0","h1","h2"].
SELECT GET_JSON_OBJECT('{"aaa":"bbb","ccc":{"ddd":"eee","fff":"ggg","hhh":["h0","h1","h2"]},"iii":"jjj"}','$.ccc.hhh[*]');
-- Gunakan pendekatan escape karakter khusus JSON saat output.
SET odps.sql.udf.getjsonobj.new=false;
-- Mengembalikan ["h0","h1","h2"].
SELECT GET_JSON_OBJECT('{"aaa":"bbb","ccc":{"ddd":"eee","fff":"ggg","hhh":["h0","h1","h2"]},"iii":"jjj"}','$.ccc.hhh[*]');
-- Mengembalikan h1.
SELECT GET_JSON_OBJECT('{"aaa":"bbb","ccc":{"ddd":"eee","fff":"ggg","hhh":["h0","h1","h2"]},"iii":"jjj"}','$.ccc.hhh[1]');
Contoh 3: Ekstraksi informasi dari data JSON yang mengandung.
-- Siapkan data uji.
CREATE TABLE json_test (id STRING, json STRING);
-- Masukkan data dengan Key yang mengandung titik (.).
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}]
}
}
}"
);
-- Masukkan data dengan Key yang tidak mengandung titik (.).
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}]
}
}
}"
);
-- Gunakan tanda kurung siku [''] untuk mengurai data yang mengandung '.'.
-- Di sini mengekstraksi nilai 'id' di bawah 'China.beijing', mengembalikan 0.
SELECT GET_JSON_OBJECT(json, "$['China.beijing'].school['id']") FROM json_test WHERE id =1;
-- Untuk data tanpa karakter khusus, penggunaan '.' dan [''] sama-sama valid dan ekuivalen.
-- Di sini mengekstraksi nilai 'id' di bawah 'China_beijing', mengembalikan 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;
Contoh 4: Saat Key JSON itu sendiri mengandung ., Anda dapat menggunakan [''] sebagai pengganti
SET odps.sql.udf.getjsonobj.new=true;
-- Mengembalikan 1.
SELECT GET_JSON_OBJECT('{"a.1":"1","a":"2"}', '$[\'a.1\']');
Contoh 5: Input JSON kosong atau dalam format ilegal
-- Mengembalikan NULL.
SELECT GET_JSON_OBJECT('','$.array[1][1]');
-- Mengembalikan NULL.
SELECT GET_JSON_OBJECT('"array":["aaaa",1111],"bbbb":["cccc",3333]','$.array[1][1]');
Contoh 6: String JSON melibatkan escape
SET odps.sql.udf.getjsonobj.new=true;
--Mengembalikan "1".
SELECT GET_JSON_OBJECT('{"a":"\\"1\\"","b":"2"}', '$.a');
--Mengembalikan '1'.
SELECT GET_JSON_OBJECT('{"a":"\'1\'","b":"2"}', '$.a');
Contoh 7: Mendukung string encoding yang sesuai dengan emoji
-- Mengembalikan simbol emoji.
SELECT GET_JSON_OBJECT('{"a":"<Emoji符号>"}', '$.a');
Catatan: DataWorks saat ini tidak mendukung input emoji secara langsung. Emoji hanya dapat dimasukkan ke MaxCompute melalui alat seperti Data Integration dalam bentuk string encoding-nya, lalu diproses menggunakan fungsi GET_JSON_OBJECT.
Dokumentasi Terkait
-
Untuk fungsi terkait lainnya, lihat Fungsi JSON.
-
Untuk studi kasus praktik terbaik, lihat Migrasi Data JSON dari OSS ke MaxCompute.
-
Untuk informasi lebih lanjut tentang json_path, lihat LanguageManual UDF.