Skip to content

JSON Diff (Bandingkan)

Bandingkan dua file JSON langsung di browser Anda. Sorotan side-by-side, output RFC 6902 JSON Patch, abaikan field seperti timestamp dan ID. 100% privat, tanpa upload.

Tanpa Pelacakan Berjalan di Browser Gratis
Ignore paths:
Opsi Lanjutan
Array mode
Reviewed for RFC 6902/6901 compliance and edge cases including null vs missing keys, type drift, floating-point precision, and array key alignment. — Go Tools API Tooling Team · May 4, 2026

Apa itu JSON Diff?

JSON Diff adalah perbandingan struktural dari dua dokumen JSON yang menghormati model data JSON — key tidak berurutan, tipe bersifat strict, dan array dapat berurutan atau berdasarkan key. Tidak seperti text diff (yang membandingkan baris dan melaporkan pengurutan ulang key atau whitespace sebagai perbedaan), JSON diff menghasilkan hasil yang bermakna secara semantis.

Bentuk yang dapat dibaca mesin secara kanonik adalah JSON Patch (RFC 6902), array ops terurut (add, remove, replace, move, copy, test) yang mengubah satu dokumen menjadi dokumen lainnya. Path menggunakan JSON Pointer (RFC 6901). Terkait erat: JSON Merge Patch (RFC 7396) — lebih sederhana tetapi tidak dapat membedakan 'hapus key' dari 'set key ke null'. Tool ini menghasilkan RFC 6902.

Kesamaan mendalam pada JSON di JavaScript lebih sulit dari yang terlihat. JSON.stringify(a) === JSON.stringify(b) gagal pada pengurutan ulang key, menyesatkan pada -0 vs 0 (keduanya di-stringify menjadi "0"). Diff yang benar harus menelusuri kedua tree secara paralel menggunakan key-set union, membedakan null dari missing via operator 'in', dan memutuskan apa arti 'sama' untuk angka (Object.is secara default, epsilon untuk tolerance).

Tool ini berjalan sepenuhnya di browser Anda. Input tidak pernah meninggalkan mesin Anda. Aman untuk API response, schema internal, dan config yang bersifat proprietary.

Bekerja dengan tool JSON terkait? Format dengan JSON Formatter; konversi dengan JSON to YAML dan YAML to JSON.

// Two JSON documents that look different but are semantically equal
const a = '{"a":1,"b":2}';
const b = '{"b":2,"a":1}';

// Naive comparison — wrong
JSON.stringify(JSON.parse(a)) === JSON.stringify(JSON.parse(b));
// → false (key order differs)

// JSON Diff (this tool) — correct: key order is irrelevant
// → 0 differences

// JSON Patch (RFC 6902) for { "a": 1 } → { "a": 2 }
// [{ "op": "replace", "path": "/a", "value": 2 }]

Fitur Utama

Side-by-Side + JSON Patch

Dua tampilan dari satu diff: sorotan visual untuk review, RFC 6902 patch untuk otomasi.

Abaikan Field yang Berisik

Preset satu klik menghapus /createdAt, /updatedAt, /*Id, /*At, requestId, traceId. Pola Extended JSON Pointer kustom didukung.

Cocokkan Array by Key

Bandingkan array of objects berdasarkan field id daripada berdasarkan index — untuk K8s envs, entri package-lock, atau daftar yang secara logis tidak berurutan.

Type-Strict secara Default

1 ≠ "1". null ≠ missing. Tangkap drift serialisasi backend begitu muncul dalam test fixture.

100% Berbasis Browser

Input tidak pernah meninggalkan mesin Anda. Tidak ada upload, tidak ada penyimpanan JSON ke localStorage, tidak ada analitik pada yang Anda tempelkan.

Bagikan Link, Bukan Data

Share Link hanya menulis konfigurasi Anda ke URL. Input JSON Anda tetap lokal.

Contoh

Regresi API Response

{"user":{"id":1,"name":"Ada","createdAt":"2024-01-01"}}
{"user":{"id":1,"name":"Ada Lovelace","createdAt":"2024-02-02"}}

Dua perubahan (name + createdAt). Tambahkan /user/createdAt ke Ignore paths agar hanya perubahan name yang tersisa.

Audit Config File (Urutan Key)

{"a":1,"b":2,"c":3}
{"c":3,"a":1,"b":2}

Data sama, urutan key berbeda. JSON Diff memperlakukan urutan key sebagai tidak relevan secara semantis — diff kosong.

Array of Objects (Match by Key)

[{"id":1,"qty":3},{"id":2,"qty":5}]
[{"id":2,"qty":5},{"id":1,"qty":4}]

Ubah Array mode ke 'Match by key' dengan key=id. Tanpa alignment setiap elemen tampak berubah; dengan alignment hanya qty pada id=1 yang berubah.

Output JSON Patch (RFC 6902)

{"items":[{"id":1,"price":29.99}]}
{"items":[{"id":1,"price":24.99}]}

Beralih ke tab JSON Patch untuk mendapatkan [{"op":"replace","path":"/items/0/price","value":24.99}] yang dapat diterapkan dengan fast-json-patch.

Cara Penggunaan

  1. 1

    Tempelkan kedua dokumen JSON

    Tempelkan JSON asli (kiri) dan yang dimodifikasi (kanan). Live diff dirender saat Anda mengetik; input besar (>200 KB) beralih ke tombol Diff manual.

  2. 2

    Filter kebisingan

    Klik preset (Timestamps / IDs / Trace) atau tempelkan pola Extended JSON Pointer ke Ignore paths untuk menghapus field yang tidak relevan.

  3. 3

    Pilih tampilan yang Anda butuhkan

    Side-by-Side untuk review oleh manusia, JSON Patch (RFC 6902) untuk ops yang dapat diterapkan oleh mesin. Gunakan Share Link untuk mengirim konfigurasi ke rekan kerja.

Jebakan Umum dalam Diff

Kebisingan Urutan Key (Gejala Text Diff)

Jika tool diff Anda melaporkan {"a":1,"b":2} vs {"b":2,"a":1} sebagai berbeda, itu melakukan line diff, bukan JSON diff. Key JSON tidak berurutan — tool ini mengabaikan urutan key secara otomatis.

✗ Salah
diff a.json b.json   # text diff: 'everything changed'
✓ Benar
JSON Diff (this tool): 0 differences

Kebingungan Null vs Missing

{"a":null} dan {} tidak sama. Memperlakukan keduanya sebagai sama menyembunyikan bug backend yang nyata.

✗ Salah
{"a": null} == {}   # collapsed by some tools
✓ Benar
{"a": null} ≠ {}     # type-strict diff

Urutan Array Tanpa Key Alignment

[{id:1},{id:2}] vs [{id:2},{id:1}] bukan '2 perubahan' untuk set logis. Sequential melaporkannya demikian; beralih ke Match by key.

✗ Salah
Sequential diff: 4 modified
✓ Benar
Match by key (id): 0 differences

Drift Tipe (Number vs String)

Backend terkadang mem-serialisasi ID secara tidak konsisten — 42 vs "42". Tool ini menandainya sebagai modifikasi 'type' sehingga Anda dapat menemukan drift lebih awal.

✗ Salah
{"id": 42} vs {"id": "42"}   # serialization bug
✓ Benar
Diff reports 'modified (type)' with both values

Presisi Floating-Point

0.1 + 0.2 !== 0.3 dalam IEEE 754. Dengan tolerance=0 (default), ini akan ditandai. Set tolerance ke 1e-9 jika Anda menginginkan kesetaraan numerik.

✗ Salah
tolerance=0:  0.30000000000000004 ≠ 0.3
✓ Benar
tolerance=1e-9: equal

Kebisingan Timestamp & UUID

createdAt, updatedAt, requestId, traceId berubah setiap request. Gunakan preset Ignore paths untuk menghapusnya.

✗ Salah
Diff: 47 modifications (45 are timestamps)
✓ Benar
Add /createdAt, /updatedAt, /requestId to Ignore paths → 2 real changes

Kasus Penggunaan Umum

Regresi API Response
Bandingkan response staging vs produksi; abaikan timestamp dan request ID untuk menampilkan hanya perubahan payload yang bermakna.
Kegagalan Snapshot Test CI
Tempelkan actual vs expected dari snapshot Jest/Vitest yang gagal. Filter kebisingan dan temukan perubahan nyata dalam hitungan detik.
Konflik package-lock / yarn.lock
Selesaikan merge conflict dengan menyelaraskan dependensi berdasarkan nama; urutan key dan field yang tidak relevan tidak lagi menjadi kebisingan.
Audit K8s / Helm Values
Cocokkan envs, volumeMounts, dan ports berdasarkan nama. Tangkap perubahan urutan yang tidak disengaja vs pengeditan konfigurasi nyata.
Cakupan Terjemahan i18n
Diff en.json terhadap zh.json secara struktural untuk menemukan key terjemahan yang hilang atau berlebih tanpa kebisingan nilai.
Review Plan Terraform / CDK
Bandingkan output plan antar run; numeric tolerance menangani aritmetika floating-point, ignore paths menghapus ARN dan timestamp.

Detail Teknis

Output Patch Sesuai RFC 6902
Menghasilkan ops JSON Patch yang valid (add/remove/replace) dengan path RFC 6901. Diverifikasi terhadap fast-json-patch@3.x dan package npm rfc6902.
Traversal Iteratif
Traversal dengan explicit-stack (tanpa rekursi) dibatasi pada 100.000 node dan kedalaman 64 untuk mencegah stack overflow pada input yang berpotensi menyerang.
Kesamaan Numerik Object.is
Numeric tolerance default adalah 0 — menggunakan Object.is sehingga -0 dan +0 dibedakan. Set tolerance > 0 untuk kesamaan berbasis epsilon.

Praktik Terbaik

Filter Sebelum Review
Tambahkan Ignore paths terlebih dahulu (timestamp, ID, trace field), lalu baca diff. Mereview diff yang berisik melatih mata untuk melewatkan — dan melewatkan — perubahan nyata.
Match-by-Key untuk Set Logis
Jika array Anda merepresentasikan set yang tidak berurutan (envs, users, dependencies), gunakan Match by key. Sequential diff pada set logis hampir selalu salah.
Bagikan Link, Bukan Input
Gunakan Share Link untuk mengirim konfigurasi filter ke kolega — jangan pernah menempelkan JSON sensitif ke dokumen bersama. URL hanya berisi konfigurasi.

Pertanyaan yang Sering Diajukan

Mengapa diff saya menampilkan semua field berubah padahal saya hanya mengubah satu field?
Tiga penyebab umum: (1) urutan key berbeda — JSON Diff memperlakukan urutan key sebagai setara, tetapi tool diff teks tidak; (2) timestamp/UUID/auto-ID yang berubah setiap request — tambahkan ke Ignore paths; (3) urutan array, saat perbandingan by-index tidak sesuai — ubah Array mode ke 'Match by key'.
Bagaimana cara mengabaikan timestamp dan ID dalam JSON diff?
Gunakan input Ignore paths di atas. Klik preset 'Timestamps' atau 'IDs' untuk filter satu klik pada /createdAt, /updatedAt, /*Id, /*At, /requestId. Anda juga dapat menempelkan pola Extended JSON Pointer sendiri — satu per baris — untuk filter lanjutan.
Apa perbedaan antara JSON Patch dan visual diff?
Visual (side-by-side) diff untuk manusia — review perubahan secara visual. JSON Patch (RFC 6902) untuk mesin — array ops terstruktur (add/remove/replace) yang dapat diterapkan dengan package npm fast-json-patch atau rfc6902. Diff yang sama, dua output.
Apakah JSON diff memperlakukan null dan key yang tidak ada sebagai sama?
Tidak. {"a":null} dan {} berbeda — yang pertama memiliki null eksplisit, yang kedua tidak memiliki key. Sistem nyata berperilaku berbeda untuk keduanya; tool ini membedakannya.
Bagaimana array dibandingkan — by index atau by key?
By index (Sequential) secara default. Ubah ke 'Match by key' dan sediakan key field (biasanya id) untuk menyelaraskan elemen terlepas dari urutan. Gunakan ini untuk K8s envs, entri package-lock, atau daftar yang secara logis merupakan set.
Bisakah saya mengekspor diff sebagai RFC 6902 JSON Patch?
Ya. Tab JSON Patch menghasilkan array ops RFC 6902 yang valid. Jika Ignore paths diset, patch akan difilter (tab menampilkan '(filtered: excludes {n} ignored paths)') dan tidak akan menghasilkan kembali dokumen asli secara tepat. Kosongkan Ignore paths untuk patch lengkap.
Apakah JSON Patch sama dengan JSON Merge Patch (RFC 7396)?
Tidak. RFC 6902 (JSON Patch) adalah array ops terurut — eksplisit dan dapat dibalik. RFC 7396 (Merge Patch) adalah dokumen merge tunggal — lebih sederhana tetapi tidak dapat membedakan penghapusan dari pengaturan null. JSON Diff menghasilkan RFC 6902.
Bagaimana cara membandingkan dua file JSON besar (>10 MB)?
File di atas ~5 MB melebihi memori browser yang praktis. Live mode dinonaktifkan pada 200 KB; untuk file berukuran multi-megabyte, gunakan jq command-line atau fast-json-patch di Node.
Apakah tool ini mengirim JSON saya ke server?
Tidak. Semua perbandingan berjalan secara lokal di browser Anda. Input tidak pernah ditulis ke disk, jaringan, localStorage, atau parameter URL. Menyegarkan halaman akan menghapusnya. Tombol Share Link hanya menulis konfigurasi Anda (Array mode, Ignore paths) — bukan data Anda.
Mengapa 42 berbeda dari "42" dalam diff?
JSON Diff bersifat type-strict: angka 42 dan string "42" tidak sama. Ini menangkap drift serialisasi backend (beberapa endpoint mengembalikan ID numerik, yang lain mengembalikan string) — diff melabelinya sebagai modifikasi 'type'.
Bisakah saya membandingkan JSON dengan komentar (JSONC) atau trailing comma?
JSON standar (RFC 8259) tidak mengizinkan komentar atau trailing comma. Tool ini menggunakan JSON.parse bawaan, yang menolak keduanya. Hapus komentar terlebih dahulu menggunakan JSON Formatter.
Bagaimana cara membandingkan array bersarang dari objek berdasarkan key seperti id?
Set Array mode ke 'Match by key' dan masukkan id. Diff menyelaraskan berdasarkan nilai id. v1 menerapkan key field yang sama di setiap kedalaman array; array dalam yang tidak memiliki field tersebut akan kembali ke sequential dan menampilkan peringatan.
Apakah diff menangani presisi floating-point (0.1 + 0.2)?
Ya, dengan Numeric tolerance. Default adalah 0 dengan Object.is — sehingga -0 vs +0 akan ditandai. Set tolerance ke epsilon kecil (mis. 1e-9) dan 0.1 + 0.2 akan dianggap sama dengan 0.3. Tolerance hanya berlaku untuk nilai numerik di leaf node.