Bekerja dengan JSON Bersarang: Flattening, Querying, dan Transformasi Data
JSON menyimpan object di dalam object, array di dalam object, dan object di dalam array, karena begitulah program memodelkan data. Spreadsheet, berkas CSV, dan tabel SQL tidak bersarang sama sekali; semuanya dua dimensi, baris dan kolom. Flattening menjembatani keduanya, dan sebagian besar pekerjaan dengan JSON bersarang adalah memutuskan kapan melakukan flatten dan kapan membiarkan strukturnya.
Mengapa JSON yang bersarang dalam menolak spreadsheet dan SQL
Object JSON dengan tiga level nesting dan array di dalamnya tidak punya pemetaan baris/kolom yang jelas. Field mana menjadi kolom, dan bagaimana dengan field yang berulang per item array? Tempel JSON bersarang ke konverter 'JSON to CSV' yang naif atau impor JSON Excel, dan hasilnya entah membuang field bersarang atau menumpuknya ke satu sel sebagai blob stringified. Kedua hasil itu membuang struktur yang ingin Anda filter, urutkan, atau query.
Alatnya tidak rusak; representasinya yang tidak cocok. JSON bersarang mengodekan pohon, sedangkan spreadsheet atau tabel SQL mengodekan daftar record yang datar. Untuk berpindah dari satu ke yang lain, Anda harus memutuskan cara menangani ketidakcocokan itu, dan konversi format saja tidak memutuskannya untuk Anda.
Arti flattening
Flattening mengubah struktur bersarang menjadi object satu level, di mana setiap path bersarang menjadi satu key yang disambung dengan titik (`user.address.city`) atau ditulis dalam notasi kurung siku (`user[address][city]`). Item array mendapat indeks dalam path (`roles.0`, `roles.1`), sehingga daftar menjadi sekumpulan key yang bisa dialamati satu per satu. Hasilnya tidak bersarang: setiap nilai berupa string, number, atau boolean polos, dan setiap key menunjuk satu nilai leaf dalam dokumen asli.
Kolom spreadsheet, baris SQL, atau key/value store sederhana membutuhkan properti itu: satu key per nilai leaf, tanpa nesting.
Contoh pengerjaan
Ambil record pengguna bersarang yang khas dengan object address dan array string role.
{
"user": {
"id": 42,
"name": "Ada Lovelace",
"address": {
"city": "London",
"postcode": "W1"
},
"roles": ["admin", "editor"]
}
}{
"user.id": 42,
"user.name": "Ada Lovelace",
"user.address.city": "London",
"user.address.postcode": "W1",
"user.roles.0": "admin",
"user.roles.1": "editor"
}Enam key, tanpa nesting, dan masing-masing adalah path tak ambigu menuju satu nilai asli. Anda bisa memakainya sebagai enam kolom spreadsheet atau enam kolom dalam satu baris SQL.
Kapan melakukan flatten vs. mempertahankan nesting
Lakukan flatten ketika tujuannya tabular (ekspor CSV, spreadsheet, satu baris tabel SQL, alat analitik yang hanya paham kolom datar) dan ketika array berupa daftar skalar pendek (seperti `roles` di atas) sehingga key berindeks per item masih wajar.
Pertahankan nesting, atau ubah strukturnya, ketika array berisi object utuh yang jumlahnya berbeda per record. Bayangkan array `orders` di mana tiap pengguna punya jumlah order berbeda, masing-masing dengan beberapa field. Flatten di tempat akan memberi setiap record kumpulan kolom berbeda yang tidak rata (`orders.0.total`, `orders.1.total`, ... `orders.14.total` untuk pelanggan terbesar Anda) atau melipat seluruh array menjadi satu sel JSON stringified, sehingga flatten kehilangan gunanya. Untuk array of object, pakai normalisasi relasional klasik: pindahkan array ke tabel/sheet tersendiri dengan foreign key ke record induk. Alat JSON to Table milik JsonForge melakukan ini untuk Anda. Ia me-flatten field skalar menjadi kolom tabel dan memecah array of object menjadi tabel terkait tersendiri, bukan merusaknya menjadi kolom berindeks angka.
Akses berbasis path: query tanpa me-flatten semuanya
Kadang Anda hanya butuh satu nilai dari struktur yang bersarang dalam, bukan dokumen yang di-flatten. Notasi dot-path (`user.address.city`) atau ekspresi gaya JSONPath (`$.user.address.city`, `$.roles[0]`) mengalamati satu nilai bersarang secara langsung. Flattening menerapkan ide yang sama ke seluruh dokumen; path menerapkannya ke satu pencarian. `lodash.get(obj, 'user.address.city')`, interpolasi variabel di kebanyakan template engine, dan alat query JSON bekerja dengan cara ini.
Kedua teknik ini saling melengkapi. Alat JSON Flatten milik JsonForge menerapkan transformasi dot-path ke seluruh dokumen sekaligus dan mengubah setiap nilai bersarang menjadi key datar. Gunakan saat tujuannya spreadsheet, key/value store sederhana, atau alat yang tak bisa menelusuri struktur bersarang.
FAQ
- Apa bedanya flattening dengan men-stringify field bersarang?
- Flattening mengubah setiap nilai bersarang menjadi key skalar level atas tersendiri, jadi Anda tetap bisa meng-query, mengurutkan, dan memfilter setiap nilai. Men-stringify field bersarang melipatnya menjadi satu blob teks opaque. Anda bisa menampilkannya, tetapi tidak bisa memfilter nilai di dalamnya atau mengurutkannya tanpa mem-parse ulang string itu. Stringify menunda masalah yang diselesaikan flattening.
- Bagaimana array direpresentasikan saat me-flatten JSON?
- Konvensi standarnya menambahkan indeks array ke path, jadi `roles: ["admin", "editor"]` menjadi `roles.0: "admin"` dan `roles.1: "editor"`. Cara ini cocok untuk daftar skalar yang pendek dan cenderung tetap. Untuk array yang panjangnya sangat bervariasi antar-record, hasilnya kumpulan key yang tidak rata dan terus bertambah, dan tabel terkait terpisah lebih cocok.
- Bisakah object JSON yang di-flatten dikembalikan ke bentuk bersarang aslinya?
- Bisa. 'Unflattening' memecah setiap key dot-path menjadi bagian-bagiannya dan membangun ulang object dan array bersarang, selama Anda menerapkan konvensi pemisah secara konsisten dan tidak ada key asli yang mengandung titik literal.
- Apakah notasi titik adalah satu-satunya cara merepresentasikan key yang di-flatten?
- Tidak. Notasi titik (`user.address.city`) adalah yang paling umum karena mencerminkan cara Anda mengakses nilainya di JavaScript atau Python, tetapi notasi kurung siku (`user[address][city]`) dan key bersambung underscore (`user_address_city`) juga dipakai, terutama oleh alat yang menargetkan lingkungan di mana titik pada nama kolom merepotkan (sebagian dialek SQL, alat spreadsheet tertentu). Konvensinya kurang penting daripada menerapkannya konsisten di seluruh dokumen.
Coba alat ini
Artikel terkait
Apa itu JSON? Panduan Lengkap untuk Pemula →
JSON (JavaScript Object Notation) adalah format pertukaran data yang ringan, mudah dibaca manusia dan mudah diurai mesin. Pelajari sintaks, tipe data, dan struktur yang menjadi fondasi API modern.
Sejarah JSON: Dari Tahun 2000 hingga Menjadi Standar Industri →
Telusuri JSON dari ide Douglas Crockford tahun 2001, diadopsi oleh Yahoo, hingga menjadi standar ECMA-404 yang menggerakkan 90% API modern.
Panduan Lengkap JSON Schema (Draft 7) →
JSON Schema adalah standar untuk mendeskripsikan dan memvalidasi struktur JSON. Pelajari keyword inti, bangun schema API nyata, dan terapkan praktik terbaik.