All Products
Search
Document Center

MaxCompute:GET_JSON_OBJECT

Last Updated:Jan 01, 2026

Fungsi GET_JSON_OBJECT mengekstrak sebuah string dari string JSON atau nilai bertipe data JSON berdasarkan path JSON yang ditentukan, json_path.

Sintaksis

STRING GET_JSON_OBJECT(JSON|STRING <json>, STRING <json_path>)

-- Contoh: Mengembalikan Alice.
SELECT GET_JSON_OBJECT(JSON '{"name": "Alice", "age": 30}', '$.name');

Catatan penggunaan

  • Fungsi GET_JSON_OBJECT tidak mendukung sintaksis ekspresi reguler dalam path JSON.

  • Sintaksis path JSON untuk tipe data JSON yang baru berbeda dari spesifikasi awal, sehingga dapat menyebabkan masalah kompatibilitas.

  • Jika suatu kueri berisi beberapa fungsi GET_JSON_OBJECT yang memproses data JSON yang sama, string JSON tersebut akan diurai berulang kali. Hal ini dapat menurunkan performa dan meningkatkan biaya. Untuk menghindarinya, Anda dapat menggabungkan GET_JSON_OBJECT dengan user-defined table-valued function (UDTF) guna mentransformasi data log JSON. Untuk informasi selengkapnya, lihat Mengonversi data log JSON menggunakan fungsi bawaan MaxCompute dan UDTF.

Parameter

  • json: Wajib diisi. Data JSON yang ingin diproses. Parameter ini mendukung dua tipe input: JSON dan STRING.

    • Tipe JSON: Nilai bertipe data JSON. Nilainya harus dalam format {"Key":"Value", "Key":"Value",...}, seperti JSON '{"name": "Alice", "age": 30}'.

    • Tipe STRING: Jika input berupa STRING, string tersebut harus memenuhi persyaratan format berikut:

      • String harus dalam format '{"Key":"Value", "Key":"Value",...}', seperti '{"name": "Alice", "age": 30}'.

      • Tanda kutip ganda (") harus di-escape dengan dua backslash (\\).

      • Tanda kutip tunggal (') harus di-escape dengan satu backslash (\).

  • json_path: Wajib diisi. Sebuah STRING yang menentukan ekspresi path JSON untuk mengekstrak data. Path harus diawali dengan karakter $, seperti $.aliyun.test[0].demo. Ekspresi path menggunakan karakter berikut:

    • $: Menunjukkan node root.

    • . atau ['']: Menunjukkan node anak. Digunakan untuk mengurai objek JSON, seperti $.store.book. Jika kunci JSON mengandung titik (.), Anda dapat menggunakan [''] sebagai gantinya.

      Pengekstrakan data menggunakan [''] hanya didukung jika Anda menjalankan pernyataan SET odps.sql.udf.getjsonobj.new=true;.

    • []: [number] menunjukkan indeks array. Indeks dimulai dari 0.

    • *: Karakter wildcard untuk []. Mengembalikan seluruh array. Tanda bintang (*) tidak dapat di-escape.

Nilai kembali

Mengembalikan nilai bertipe STRING, yaitu data yang diekstrak dari path yang ditentukan. Fungsi ini mengikuti aturan berikut untuk nilai kembalinya:

  • Jika json valid dan json_path ada, string yang sesuai dikembalikan.

  • Jika json kosong atau memiliki format yang tidak valid, NULL dikembalikan.

  • Jika json_path mengandung [*], nilai kembali tidak dalam format array. Untuk memaksa nilai kembali berada dalam format array yang seragam, Anda dapat menjalankan pernyataan SET odps.sql.force.getjsonobj.array.format=true;.

  • Jika json_path tidak valid, NULL dikembalikan.

Perilaku Pengembalian

  • Anda dapat mengontrol perilaku nilai kembali fungsi dengan mengatur flag tingkat proyek atau tingkat sesi menggunakan perintah berikut: SET odps.sql.udf.getjsonobj.new=true/false;.

    Dua perilaku nilai kembali yang sesuai dengan pengaturan flag berbeda adalah sebagai berikut:

    Penting

    Kami menyarankan Anda menggunakan konfigurasi SET odps.sql.udf.getjsonobj.new=true;. Konfigurasi ini menyediakan perilaku fungsi yang lebih standar, menyederhanakan pemrosesan data, dan meningkatkan performa. Jika proyek MaxCompute Anda memiliki pekerjaan yang sudah ada yang bergantung pada perilaku escaping karakter ter-reserve JSON, kami menyarankan Anda tetap menggunakan perilaku aslinya untuk mencegah kesalahan atau masalah kebenaran yang mungkin terjadi jika Anda beralih ke perilaku baru tanpa verifikasi terlebih dahulu.

    Pengaturan Parameter

    SET odps.sql.udf.getjsonobj.new=true;

    SET odps.sql.udf.getjsonobj.new=false;

    Perilaku nilai kembali

    Menampilkan string asli tanpa modifikasi.

    Menampilkan string dengan karakter ter-reserve JSON di-escape.

    Nilai kembali adalah string JSON yang dapat diurai secara langsung. Anda tidak perlu menggunakan fungsi seperti REPLACE atau REGEXP_REPLACE untuk mengganti backslash.

    Karakter ter-reserve JSON, seperti line feed (\n) dan tanda kutip ("), dikembalikan sebagai string '\n' dan '\"'.

    Penguraian kunci duplikat

    Objek JSON dapat berisi kunci duplikat, yang dapat diurai dengan sukses.

    -- Mengembalikan 1.
    SELECT GET_JSON_OBJECT('{"a":"1","a":"2"}', '$.a');

    Objek JSON tidak boleh berisi kunci duplikat. Jika ada, penguraian dapat gagal.

    -- Mengembalikan NULL.
    SELECT GET_JSON_OBJECT('{"a":"1","a":"2"}', '$.a');

    Urutan pengurutan output

    Output diurutkan sesuai urutan asli dalam string JSON.

    -- Mengembalikan {"b":"1","a":"2"}.
    SELECT GET_JSON_OBJECT('{"b":{"b":"1","a":"2"},"a":"2"}', '$.b');

    Output diurutkan secara alfabetis.

    -- Mengembalikan {"a":"2","b":"1"}.
    SELECT GET_JSON_OBJECT('{"b":{"b":"1","a":"2"},"a":"2"}', '$.b');
  • Jika mode kompatibilitas Hive diaktifkan dengan menjalankan perintah SET odps.sql.hive.compatible=true;, fungsi GET_JSON_OBJECT mempertahankan string asli dalam nilai kembalinya.

  • Untuk proyek MaxCompute yang dibuat pada atau setelah 21 Januari 2021, perilaku nilai kembali default fungsi GET_JSON_OBJECT adalah mempertahankan string asli.

  • Untuk proyek MaxCompute yang dibuat sebelum 21 Januari 2021, perilaku nilai kembali default fungsi GET_JSON_OBJECT adalah melakukan escaping karakter ter-reserve JSON.

  • Anda dapat menggunakan contoh berikut untuk menentukan perilaku mana yang digunakan oleh fungsi GET_JSON_OBJECT di proyek MaxCompute Anda. Untuk melakukannya, jalankan perintah berikut:

    SELECT GET_JSON_OBJECT('{"a":"[\\"1\\"]"}', '$.a');
    --Nilai kembali jika perilaku adalah melakukan escaping karakter ter-reserve JSON:
    [\"1\"]
    
    --Nilai kembali jika perilaku adalah mempertahankan string asli:
    ["1"]
    Untuk mengubah perilaku nilai kembali default fungsi GET_JSON_OBJECT di proyek Anda menjadi mempertahankan string asli, Anda dapat mengajukan tiket. Hal ini menghindari kebutuhan untuk mengatur properti tersebut pada tingkat sesi setiap kali.

Contoh

Parameter input JSON

Contoh 1: Mendapatkan nilai untuk kunci tertentu dari data JSON

-- 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: json_path yang tidak valid mengembalikan NULL.

-- Mengembalikan NULL.
SELECT GET_JSON_OBJECT(JSON '{"a":1, "b":2}', '$invalid_json_path');

Parameter input STRING

Contoh 1: Mengekstrak informasi dari objek JSON src_json.json

-- Menyiapkan 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"}');

-- Mengekstrak informasi dari bidang owner. Nilai kembalinya adalah amy.
SELECT GET_JSON_OBJECT(src_json.json, '$.owner') FROM src_json;

-- Opsional. Output dengan mempertahankan string asli.
SET odps.sql.udf.getjsonobj.new=true;
-- Mengekstrak informasi dari array pertama dalam bidang store.fruit. Nilai kembalinya adalah {"weight":8,"type":"apple"}.
SELECT GET_JSON_OBJECT(src_json.json, '$.store.fruit[0]') FROM src_json;

-- Mengekstrak informasi dari bidang yang tidak ada. Nilai kembalinya adalah NULL.
SELECT GET_JSON_OBJECT(src_json.json, '$.non_exist_key') FROM src_json;

Contoh 2: Mengekstrak informasi dari data array JSON

-- Mengembalikan 2222.
SELECT GET_JSON_OBJECT('{"array":[["aaaa",1111],["bbbb",2222],["cccc",3333]]}','$.array[1][1]');

-- Output dengan mempertahankan string asli.
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[*]');

-- Output dengan melakukan escaping karakter ter-reserve JSON.
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: Mengekstrak informasi dari data JSON dengan titik (.) dalam kunci

-- Menyiapkan data uji.
CREATE TABLE json_test (id STRING, json STRING);

-- Memasukkan data di mana kuncinya 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}]
        }
      }
  }"
);

-- Memasukkan data di mana kuncinya 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 titik (.).
-- Ini mengekstrak nilai 'id' di bawah 'China.beijing'. Nilai kembalinya adalah 0.
SELECT GET_JSON_OBJECT(json, "$['China.beijing'].school['id']") FROM json_test WHERE id =1;

-- Untuk data tanpa karakter khusus, baik '.' maupun [''] sama-sama valid dan ekuivalen.
-- Ini mengekstrak nilai 'id' di bawah 'China_beijing'. Nilai kembalinya adalah 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: Menggunakan [''] untuk kunci yang mengandung titik (.)

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 tidak valid

-- 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 yang di-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: Dukungan emoji

-- Mengembalikan simbol emoji.
SELECT GET_JSON_OBJECT('{"a":"<Emoji symbol>"}', '$.a');
Catatan: DataWorks tidak mendukung pemasukan karakter emoji secara langsung. Anda dapat menggunakan tool seperti Data Integration untuk menulis string terenkripsi yang sesuai dengan karakter emoji ke MaxCompute. Kemudian, Anda dapat menggunakan fungsi GET_JSON_OBJECT untuk memprosesnya.

Referensi