Skip to content
jsonforge.app
Kembali ke blog
Panduan6 menit baca

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 terjadi. Urutan key yang berubah, format angka yang diserialisasi ulang, atau indentasi berbeda bisa membuat dokumen yang sama tampak ditulis ulang. Diff JSON struktural membandingkan makna, bukan teks, dan 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 hasil parsing identik. Diff struktural mem-parse kedua dokumen lebih dulu, lalu membandingkan nilainya, sehingga melaporkan nol perbedaan untuk object yang urutannya berubah tetapi isinya sama.

Berbeda secara tekstual, identik secara struktural.
json
// 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 melaporkan tidak ada perubahan: key sama, nilai sama, hanya urutan key dan formatnya yang berbeda.

Apa yang dilaporkan diff struktural

Diff JSON yang berguna mengelompokkan setiap perbedaan menurut jenisnya, bukan menampilkan teks sebelum/sesudah mentah. added: key yang ada di dokumen baru tetapi tidak di yang lama. removed: key yang ada di dokumen lama tetapi hilang dari yang baru. changed: key yang ada di keduanya dengan nilai berbeda. type-changed: nilai yang berganti tipe data (string menjadi number, object menjadi array). Perubahan tipe sering lebih berbahaya daripada perubahan nilai, karena bisa merusak konsumen yang mengasumsikan bentuk tetap.

Di mana tim memakai diff JSON

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 mengubah konfigurasi JSON bersama, diff struktural setiap branch terhadap ancestor bersama menunjukkan key mana yang konflik dan mana yang hanya punya perubahan tak berhubungan di dekatnya.

Mengapa array adalah bagian tersulit dari diff JSON

Object mudah dibandingkan karena key punya nama: "role" di dokumen A selalu berpasangan dengan "role" di dokumen B. Array hanya punya posisi, jadi alat diff harus memutuskan apakah item pada indeks berbeda itu "berpindah" atau "berubah". Sisipkan satu item di awal daftar dan setiap indeks berikutnya bergeser satu. Diff naif indeks-demi-indeks lalu melaporkan sisa array sebagai berubah, padahal Anda hanya menambah satu item. Alat diff yang lebih baik mencocokkan item dengan heuristik (sering berbasis field id yang stabil, jika item array punya) untuk mendeteksi penyisipan, penghapusan, dan perubahan urutan, bukan menganggap setiap indeks yang bergeser sebagai perubahan.

FAQ

Mengapa alat diff JSON saya menampilkan perubahan padahal saya tidak mengedit apa pun?
Serialisasi non-deterministik paling sering menjadi penyebabnya: timestamp yang diperbarui setiap kali disimpan, object yang diurutkan ulang oleh jalur kode berbeda, atau library yang memformat angka secara berbeda (1.0 vs 1). Periksa apakah alatnya membandingkan struktur (mengabaikan urutan key, menormalkan format angka) atau 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, dan hasilnya menyesatkan setiap kali seseorang menyisipkan, menghapus, atau mengurutkan ulang item di mana pun selain di akhir. Jika Anda mengendalikan bentuk datanya, tambahkan field id atau key pada item array, walaupun hanya untuk diff. Diff struktural akan 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 di sana manfaatnya lebih besar. Manusia tak bisa menemukan satu field berubah dalam dokumen 5.000 baris dengan mata, tetapi diff struktural langsung memunculkannya. Untuk dokumen sangat besar, pilih alat diff yang bisa memfilter atau meringkas (mis. "12 berubah, 3 ditambah, 1 dihapus") daripada menampilkan setiap perbedaan secara inline.

Coba alat ini

Artikel terkait