Cara Diff dan Membandingkan Dokumen JSON (Tanpa Kehilangan Akal)
Jalankan diff teks biasa pada dua versi berkas JSON dan Anda sering melihat jauh lebih banyak "perubahan" daripada yang benar-benar terjadi — pengurutan ulang key, format angka yang diserialisasi ulang, atau indentasi berbeda bisa membuat dokumen yang tak berubah tampak sepenuhnya ditulis ulang. Diff JSON struktural membandingkan makna, bukan teks, dan perbedaan itu sangat penting untuk apa pun yang otomatis.
Mengapa diff teks menyesatkan Anda pada JSON
Alat diff teks membandingkan baris demi baris. Jika serializer JSON mengubah urutan key, beralih dari indentasi dua spasi ke empat spasi, atau menulis 1.50 alih-alih 1.5, diff teks menandai setiap baris sebagai berubah — padahal data yang diurai identik. Diff struktural mem-parse kedua dokumen lebih dulu, lalu membandingkan nilai hasilnya: ia benar melaporkan nol perbedaan untuk object yang urutannya berubah tetapi isinya setara.
// Version A
{"name": "Ada", "role": "admin"}
// Version B
{
"role": "admin",
"name": "Ada"
}Diff berbasis baris pada pasangan ini menampilkan semuanya sebagai ditulis ulang. Diff struktural benar melaporkan tidak ada perubahan — key yang sama, nilai yang sama, hanya urutan key dan formatan yang berbeda.
Apa yang sebenarnya dilaporkan diff struktural
Diff JSON yang baik mengategorikan setiap perbedaan menurut jenisnya alih-alih sekadar menampilkan teks sebelum/sesudah mentah: added — key yang hadir di dokumen baru tetapi tidak di yang lama. removed — key yang hadir di dokumen lama tetapi hilang dari yang baru. changed — key yang hadir di keduanya, tetapi dengan nilai berbeda. type-changed — nilai yang berganti tipe data sepenuhnya (string menjadi number, object menjadi array), yang sering kali sinyal lebih serius daripada perubahan nilai sederhana karena bisa merusak konsumen yang mengasumsikan bentuk tetap.
Di mana diff JSON benar-benar dipakai
Regression testing API: tangkap respons yang diketahui baik, lalu diff setiap respons baru terhadapnya di CI. Diff struktural menandai perubahan kontrak nyata (field diganti nama atau dihapus) sambil mengabaikan derau kosmetik seperti urutan key atau nilai timestamp yang memang diharapkan berubah pada setiap run.
Deteksi config drift: bandingkan konfigurasi live layanan yang ter-deploy terhadap versi yang di-check-in ke source control untuk menangkap perubahan manual di luar jalur sebelum mereka memicu insiden.
Audit trail: simpan ringkasan diff di samping snapshot "sebelum" dan "sesudah" setiap kali record berubah, agar reviewer melihat persis field mana yang bergeser alih-alih membaca ulang dua dokumen penuh berdampingan.
Resolusi merge conflict: ketika dua branch sama-sama memodifikasi konfigurasi JSON bersama, diff struktural tiap branch terhadap ancestor bersama membuat jauh lebih jelas key spesifik mana yang benar-benar konflik dibanding yang hanya punya perubahan tak berhubungan di dekatnya.
Mengapa array adalah bagian tersulit dari diff JSON
Object ter-diff dengan bersih karena key diberi nama — "role" di dokumen A selalu berkorespondensi dengan "role" di dokumen B. Array tidak punya nama, hanya posisi, jadi alat diff harus memutuskan apakah item pada indeks berbeda itu "berpindah" atau "berbeda". Menyisipkan satu item di awal daftar menggeser setiap indeks berikutnya satu langkah — diff naif indeks-demi-indeks melaporkan seluruh sisa array sebagai berubah, padahal sungguhnya hanya satu item ditambahkan. Alat diff yang lebih baik memakai heuristik pencocokan (sering berbasis field id yang stabil, jika ada pada item array) untuk benar mendeteksi penyisipan, penghapusan, dan penyusunan ulang alih-alih memperlakukan setiap indeks bergeser sebagai perubahan.
FAQ
- Mengapa alat diff JSON saya menampilkan perubahan padahal saya tidak mengedit apa pun?
- Penyebab paling umum adalah serialisasi non-deterministik — timestamp yang diperbarui setiap kali disimpan, object yang terurut ulang dari jalur kode berbeda, atau library yang memformat angka secara berbeda (1.0 vs 1). Periksa apakah alatnya melakukan perbandingan struktural (mengabaikan urutan key, menormalkan format angka) atau perbandingan teks biasa.
- Bagaimana sebaiknya me-diff dua array JSON yang itemnya tidak punya ID stabil?
- Tanpa identifier stabil, alat diff hanya bisa membandingkan berdasarkan posisi, yang menghasilkan hasil menyesatkan setiap kali item disisipkan, dihapus, atau diurutkan ulang di mana pun selain di akhir. Jika Anda mengendalikan bentuk datanya, menambahkan field id atau key pada item array — bahkan hanya untuk keperluan diff — membuat diff struktural jauh lebih akurat.
- Bisakah diff JSON mendeteksi field yang berubah tipe, seperti string menjadi number?
- Alat diff struktural yang baik melaporkan ini secara eksplisit sebagai type change alih-alih melipatnya ke dalam kategori generik "nilai berubah", karena perubahan tipe jauh lebih mungkin merusak konsumen downstream daripada perubahan nilai dengan tipe yang sama.
- Apakah diff JSON berguna untuk dokumen besar, seperti dump API berukuran megabyte?
- Ya, dan bisa dibilang lebih bernilai justru di sana — manusia tak bisa menemukan manual satu field berubah dalam dokumen 5.000 baris, tetapi diff struktural langsung memunculkannya. Untuk dokumen sangat besar, carilah alat diff yang bisa memfilter atau meringkas (mis. "12 berubah, 3 ditambah, 1 dihapus") alih-alih menyodorkan setiap perbedaan secara inline.
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.