JSON ke Excel: Empat Pendekatan dan Di Mana Masing-Masing Kehilangan Kesetiaan
Intinya: Struktur bersarang, field yang tidak konsisten, dan array dari array adalah titik di mana konversi JSON ke spreadsheet rusak. Empat pendekatan diurutkan berdasarkan waktu hingga hasil, masing-masing dengan trade-off.

Intinya: array object yang rata atau object yang membungkus array paling cepat dikonversi melalui alat online; gunakan Power Query saat data disegarkan setiap minggu, pandas saat banyak field perlu dibersihkan, dan skrip Node hanya saat konversi harus bergabung ke pipeline — tetapi tentukan apa arti "satu baris" sebelum menyentuh data bersarang atau kunci yang tidak konsisten.
Konversinya sendiri tidak sulit; yang sulit adalah menemukan setelahnya bahwa angka berubah menjadi teks dan beberapa level penyarangan runtuh menjadi satu. Baca struktur data sebelum memilih metode dan Anda menghemat satu kali rework.
1. Pertama, tentukan jenis JSON yang Anda miliki
Buka file dan lihat tingkat terluarnya:
| Struktur | Bentuk | Tingkat kesulitan konversi |
|---|---|---|
| Array object yang rata | [{"a":1,"b":2},{...}] |
Paling mudah — satu baris per record |
| Object yang membungkus array | {"data":[{...}],"total":100} |
Mudah — ambil level data |
| Object bersarang | {"user":{"name":"x"}} |
Sedang — tentukan apakah diratakan atau digabung menjadi string |
| Array dari array | {"tags":["a","b"]} |
Menyakitkan — tidak muat dalam satu baris, perlu pemecahan tabel |
| Kunci tidak konsisten | Setiap record memiliki field berbeda | Menyakitkan — kolom akhirnya sebagian besar kosong |
Dua yang pertama dikonversi langsung dengan tingkat keberhasilan mendekati 100%; untuk tiga terakhir, tentukan dulu apa arti "satu baris", jika tidak lembar hasilnya tidak dapat digunakan.
2. Pendekatan 1: alat online (1 menit)
Buka JSON ke tabel, tempelkan data → pilih pemisah dan header → ekspor CSV → buka di Excel. Cocok untuk beberapa puluh hingga beberapa ribu baris data yang terstruktur baik.
Tiga hal yang harus Anda waspadai:
- Anda mendapat CSV, bukan xlsx. Saat Excel membuka CSV, ia menebak encoding dari locale sistem, sehingga teks Tionghoa bisa menjadi mojibake. Menggunakan "Data → From Text/CSV" dan memilih UTF-8 secara eksplisit lebih andal.
- Pengenal yang dimulai dengan
0kehilangan nolnya."007"adalah teks di CSV, tetapi Excel mengubahnya menjadi angka 7 secara otomatis. Setel kolom itu sebagai teks saat impor, atau tambahkan prefiks padanya di JSON. - Angka panjang menjadi notasi ilmiah. Nomor identitas nasional dan nomor order yang lebih dari 15 digit kehilangan presisi; field seperti ini seharusnya sudah berupa string di JSON, dan harus tetap dalam format teks setelah impor.
3. Pendekatan 2: Power Query bawaan Excel (dapat digunakan ulang)
Saat data Anda disegarkan setiap minggu, gunakan Power Query bawaan Excel: konfigurasikan sekali, lalu cukup klik "Refresh":
- "Data" → "Get Data" → "From File" → "From JSON";
- Setelah memilih file Anda masuk ke editor Power Query, di mana Anda melihat struktur
List/Record; - Klik ikon perluas di sisi kanan header kolom untuk memperluas field bersarang level demi level;
- Setelah nama kolom dan tipe tampak benar, "Close & Load".
Keunggulannya adalah penyarangan dapat diperluas menjadi beberapa kolom lapis demi lapis, dan tipe dapat ditetapkan secara manual; harganya adalah penyiapan pertama membutuhkan pemahaman perbedaan antara List dan Record — List adalah array, Record adalah object, dan keduanya memuai ke arah yang berbeda.
4. Pendekatan 3: Python + pandas (banyak field, perlu pembersihan)
import pandas as pd
# Object wrapping an array: first reach the list level
rows = pd.read_json('data.json')['data']
# Expand nested fields into multiple columns
frame = pd.json_normalize(rows, sep='_')
frame.to_excel('out.xlsx', index=False)
Parameter kunci json_normalize adalah sep, yang menentukan gaya penamaan kolom setelah field bersarang diperluas; user_name lebih mudah digunakan di Excel daripada user.name. Array dari array (seperti tags) membutuhkan langkah explode tambahan:
frame = frame.explode('tags')
Langkah ini memecah satu baris menjadi beberapa, satu-satunya cara mempertahankan relasi satu-ke-banyak — dengan konsekuensi field lainnya terduplikasi.
5. Pendekatan 4: skrip Node (saat harus bergabung ke pipeline)
import { readFileSync, writeFileSync } from 'node:fs';
const rows = JSON.parse(readFileSync('data.json', 'utf8'));
const headers = [...new Set(rows.flatMap((row) => Object.keys(row)))];
const escapeCell = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`;
const lines = [
headers.join(','),
...rows.map((row) => headers.map((key) => escapeCell(row[key])).join(',')),
];
writeFileSync('out.csv', '\uFEFF' + lines.join('\n'), 'utf8');
Dua detail yang tidak boleh dilewati: tulis \uFEFF (BOM) di awal agar Excel mengenali UTF-8, dan escape kutip ganda di dalam sel sebagai "", jika tidak kolomnya bergeser.
6. Tiga hal yang selalu hilang dalam konversi
| Yang hilang | Gejala | Perbaikan |
|---|---|---|
| Informasi tipe | Number dan boolean menjadi teks atau TRUE/FALSE |
Setel tipe kolom secara manual setelah impor, atau tentukan di Power Query |
| Level penyarangan | Field dalam runtuh menjadi [object Object] |
Gunakan json_normalize atau perluas level demi level — jangan pernah String(obj) |
| Relasi satu-ke-banyak | Array dimasukkan ke satu sel | Pisahkan baris dengan explode, atau buat tabel terkait terpisah |
Selain itu, null dan "field tidak ada" tampak sama di lembar kerja (keduanya sel kosong) tetapi bermakna berbeda dalam domain bisnis. Saat Anda perlu membedakannya, konversi null secara eksplisit menjadi string "null" di JSON, atau tambahkan kolom penanda _has_field.
7. Verifikasi setelahnya: jangan hanya melihat baris pertama
Setelah konversi, periksa sekilas setidaknya tiga hal:
- Jumlah record: jumlah baris CSV harus sama dengan panjang array + 1 (header); baris yang hilang biasanya berarti baris baru di akhir tertelan;
- Kolom dengan tingkat null tertinggi: banyak sel kosong menandakan nama kunci tidak konsisten — kembali dan periksa apakah JSON asli memakai dua ejaan (
userIddanuser_id); - Baris terpanjang: array bersarang biasanya mendarat di sana; pastikan tidak ada yang terpotong.
Saat Anda membutuhkan operasi sebaliknya (Excel/CSV kembali ke JSON), gunakan CSV ke JSON, dan ingat bahwa header diperlakukan sebagai nama kunci — mengubah header berarti mengubah nama field.
FAQ
Bagaimana cara memilih antara alat online, Power Query, dan pandas?
Gunakan alat online untuk beberapa puluh hingga beberapa ribu baris data terstruktur baik yang Anda konversi sekali. Gunakan Power Query saat data disegarkan setiap minggu, karena dikonfigurasi sekali dan disegarkan dengan satu klik. Gunakan pandas dengan json_normalize saat banyak field perlu dibersihkan, dan skrip Node saat konversi harus bergabung ke pipeline.
Mengapa teks Tionghoa berubah menjadi mojibake di CSV?
Ekspornya adalah CSV, bukan xlsx, dan Excel menebak encoding dari locale sistem, sehingga UTF-8 tanpa BOM menampilkan mojibake. Tulis BOM \uFEFF di awal file, atau buka melalui "Data → From Text/CSV" dan pilih UTF-8 secara eksplisit.
Haruskah object bersarang diratakan atau dipecah menjadi baris tambahan?
Ratalkan level demi level alih-alih menempelkannya sebagai string: Power Query memperluas field bersarang menjadi kolom, dan json_normalize dengan sep melakukan hal yang sama di pandas. Array dari array membutuhkan langkah explode tambahan yang memecah satu baris menjadi beberapa. Memberikan object dalam ke String(obj) hanya menghasilkan [object Object].