Diff JSON
Bandingkan dua dokumen JSON dan lihat apa yang ditambahkan, dihapus, atau diubah. Urutan kunci, indentasi, dan minifikasi diabaikan; tidak ada yang diunggah.
Tempel JSON di kedua panel untuk membandingkannya
Membandingkan datanya, bukan teksnya
Perbandingan baris per baris menjawab pertanyaan tentang penulisan: baris mana dari berkas ini yang bukan baris dari berkas itu. Itu pertanyaan yang tepat untuk prosa dan untuk kode sumber, dan pertanyaan yang keliru untuk JSON, karena dokumen JSON tidak punya satu cara penulisan yang benar. Ubah urutan anggota objek, ganti indentasinya, atau mampatkan salah satu sisinya, dan setiap baris berubah sementara datanya tidak bergeser sedikit pun. Alat ini membandingkan hasil penguraian kedua dokumen, jadi yang dilaporkannya adalah yang benar-benar berubah. Di bawah ini satu dokumen ditulis dua kali: dimampatkan pada baris pertama, lalu dirapikan dengan anggotanya dalam urutan lain.
{"name":"checkout","port":8080,"tags":["a","b"]}
{
"port": 8080,
"tags": ["a", "b"],
"name": "checkout"
}Keduanya tidak berbagi satu baris pun, dan alat ini tidak melaporkan perbedaan apa pun di antaranya: anggota yang sama, nilai yang sama, urutan yang sama di dalam larik. Akibat praktisnya, Anda tidak pernah perlu memformat ulang dokumen supaya perbandingannya jalan — yang justru berarti mengubah hal yang hendak Anda bandingkan.
Yang tidak pernah dihitung sebagai perbedaan
Empat hal tentang cara dokumen ditulis diabaikan, dan diabaikan tanpa syarat. Tidak ada kendali yang menyalakannya kembali, sebab alat yang bisa begitu akan menjadi dua alat dengan dua makna yang harus dijelaskan, dan pembacanya harus tahu yang mana dari keduanya yang menghasilkan jawaban di depannya.
- Urutan penulisan anggota di dalam objek. {"a": 1, "b": 2} dan {"b": 2, "a": 1} membawa data yang sama, jadi program serialisasi yang mengeluarkan kuncinya dalam urutan berbeda pada tiap jalannya tidak pernah muncul di sini sebagai perubahan.
- Spasi dalam segala bentuk — indentasi, pergantian baris, spasi setelah titik dua. Dokumen yang dimampatkan dan dokumen yang dirapikan dengan data yang sama adalah dokumen yang sama, dua kali.
- Cara angka dieja. 1e3 adalah 1000 dan 1.50 adalah 1.5, karena angka JSON punya nilai dan tidak punya ejaan: dua dokumen yang hanya berbeda di situ membawa angka yang sama, dan tidak ada apa pun yang dilaporkan tentangnya.
- Cara karakter di dalam string dilolos. Enam karakter \u0041 dan huruf A adalah string satu karakter yang sama.
Dua hal yang tampak layak masuk daftar itu justru sengaja tidak ada di sana. Urutan elemen dalam larik adalah data — [1, 2] dan [2, 1] adalah dokumen yang berbeda — dan anggota yang bernilai null tidak sama dengan anggota yang memang tidak ada, sehingga yang satu terhadap yang lain dilaporkan alih-alih dilewatkan diam-diam.
Ditambahkan, dihapus, diubah — dan perubahan tipe
Setiap baris hasil persis termasuk salah satu dari tiga jenis, dan ketiganya menutupi segala yang bisa ditemukan perbandingan. Ambil dua dokumen berikut:
{"host":"api.example.com","port":8080,"debug":true}
{"host":"api.example.com","port":"8080","retries":3}- Diubah di $['port']: anggotanya ada di kedua dokumen dan nilainya tidak sama, jadi kedua nilai ditampilkan. Baris ini juga ditandai sebagai perubahan tipe, karena 8080 adalah angka dan "8080" adalah string.
- Dihapus di $['debug']: anggotanya ada di dokumen pertama dan tidak ada di dokumen kedua.
- Ditambahkan di $['retries']: anggotanya ada di dokumen kedua dan tidak ada di dokumen pertama.
Anggota bernama host ada di keduanya dengan nilai yang sama, jadi ia sama sekali tidak dilaporkan. Perubahan tipe adalah sifat dari perubahan, bukan jenis baris keempat: itulah pergeseran yang disadari skema dan yang biasanya tidak disadari orang yang membaca dua berkas, jadi ia disebut di tempat kejadiannya alih-alih dibiarkan untuk Anda temukan sendiri.
Letak perbedaan, ditulis sebagai jalur
Setiap baris menyebut tempat ia berada, dan menyebutnya sebagai jalur ke dalam dokumen, bukan sebagai nomor baris — nomor baris adalah fakta tentang penulisan, tepat hal yang baru saja diabaikan alat ini. Jalurnya adalah Jalur Ternormalkan RFC 9535, satu-satunya ejaan yang dipakai situs ini di mana pun letak di dalam JSON perlu dituliskan.
- $ adalah keseluruhan dokumen, $['port'] adalah anggota bernama port di dalamnya, dan $['hosts'][1] adalah elemen pada indeks 1 dari larik di bawah hosts. Anggota selalu ditulis dalam kurung siku dan tanda kutip, jadi nama yang mengandung titik, spasi, atau kurung siku sendiri tidak memerlukan apa pun yang khusus.
- Jalur adalah kueri yang bisa Anda jalankan. Tempelkan ke Penguji JSONPath di situs ini bersama dokumen tempatnya berada, dan ia memilih persis simpul itu — cara tercepat membaca perbedaan beserta sekelilingnya.
- Ia adalah kueri terhadap dokumen tempat simpul itu benar-benar berada: jalur anggota yang ditambahkan berjalan pada dokumen kedua, dan jalur anggota yang dihapus pada dokumen pertama. Tidak ada apa pun di sini yang menyebut simpul yang tidak ada.
Baris yang diubah bisa membawa dua jalur, dan itulah pemasangan pada bagian berikutnya yang menyembul: begitu larik bertambah atau berkurang satu elemen, elemen yang sama berada pada indeks yang berbeda di tiap sisi. Bila kedua jalur sama — dan hampir selalu begitu — hanya satu yang ditampilkan.
Bagaimana dua larik dipasangkan
Dua objek dibandingkan anggota per anggota, dan itu mudah karena anggota punya nama. Dua larik tidak punya nama, hanya posisi, dan membandingkannya posisi per posisi adalah hal yang membuat sebagian besar keluaran perbandingan tak terbaca: sisipkan satu catatan di depan larik yang panjang, maka tidak ada lagi yang berada di tempatnya semula, sehingga perbandingan yang membaca posisi sebagai identitas akan melaporkan seluruh larik sebagai berbeda — benar dalam arti sempit dan tak berguna dalam arti lain mana pun. Maka elemennya dipasangkan lebih dulu, menurut apa isinya dan bukan menurut medan yang Anda tunjuk, dan hanya sisa dari pemasangan itulah yang dilaporkan.
{"hosts": ["alpha", "beta", "gamma"]}
{"hosts": ["alpha", "staging", "beta", "gamma"]}Itu satu baris: staging ditambahkan di $['hosts'][1]. Elemen bernama beta dan gamma bergeser satu posisi dan tidak disebut, karena bergeser bukanlah berubah. Pemasangan yang sama itu pula yang membuat satu medan yang disunting di dalam satu item larik dilaporkan sebagai perubahan pada medan itu, bukan sebagai item utuh yang diganti dengan item lain.
Urutan tetap dihitung, dan pemasangan tidak berpura-pura sebaliknya: [1, 2] terhadap [2, 1] kembali sebagai 1 yang dihapus dari depan dan 1 yang ditambahkan setelah 2 — memang itulah yang terjadi. Dua larik juga bisa terlalu berbeda sehingga memasangkannya tidak sepadan dengan biayanya, dan melewati titik itu perbandingan kembali berjalan posisi per posisi dan mengatakannya di puncak hasil, sehingga jawaban yang riuh menjadi terjelaskan alih-alih membingungkan.
Laporan dan pohon
Perbandingan yang sama disajikan dalam dua tampilan, dan berpindah di antara keduanya tidak menghitung ulang apa pun: pohon digambar justru dari daftar perbedaan yang dirinci laporan, sehingga keduanya tidak mungkin berselisih tentang apa yang berubah maupun tentang seberapa banyak perubahannya.
- Laporan menjawab apa yang berubah: satu baris untuk tiap perbedaan, masing-masing membawa jalurnya, jenisnya, dan nilainya di tiap sisi. Inilah tampilan untuk disapu mata ketika Anda ingin seluruh daftar terhampar di depan.
- Pohon menjawab di bagian mana dokumen: kedua dokumen dilebur menjadi satu kerangka, dengan hanya bagian yang memuat perbedaan yang terbuka. Setiap deret anak berurutan yang tidak memuat apa pun terlipat menjadi satu baris yang menyebut berapa banyak yang diwakilinya — pasangan pada bagian di atas tergambar sebagai lima baris: dokumennya, larik di dalamnya, satu baris terlipat yang mewakili satu elemen, elemen yang ditambahkan, dan satu baris terlipat yang mewakili dua.
- Jumlah di samping judul hasil adalah seluruh perbedaan yang ada. Ketika daftar di layar dipangkas karena panjangnya, jumlah itu tidak bergeser, dan kendali di kaki daftar menampilkan sisanya.
~! $['port'] 8080 -> "8080" - $['debug'] true + $['retries'] 3
Itulah yang dihasilkan kendali salin untuk dua dokumen pada bagian ketiga: satu tanda untuk jenisnya, lalu jalurnya, lalu nilainya dengan panah di antaranya — plus untuk anggota yang ditambahkan, minus untuk yang dihapus, tilde untuk perubahan, dan tilde dengan tanda seru bila tipenya juga berubah. Ia ditulis dengan lambang alih-alih kata dengan sengaja, supaya hasil yang ditempel adalah teks yang sama dalam bahasa situs mana pun yang sedang Anda baca, dan ia tidak memendekkan apa pun: nilai yang dipangkas layar tetap utuh di dalamnya.
Ongkos penguraian, dan apa yang dikatakan alat ini terang-terangan
Membandingkan hasil penguraian dua dokumen berarti hidup dengan ongkos penguraian itu, dan mengurai JSON tidaklah tanpa kehilangan. Hal itu lebih berat di sini daripada di mana pun di situs ini, karena jawaban yang paling tidak boleh diberikan alat perbandingan adalah «tidak ada perbedaan» untuk dua dokumen yang sesungguhnya berbeda. Maka teks tiap panel dibaca sekali lagi sebagai teks, dan apa yang jatuh dalam penguraian dilaporkan di samping perbandingan alih-alih ditelan.
- Nama anggota yang ditulis dua kali dalam objek yang sama. Hanya salinan terakhir yang selamat dari penguraian, jadi hanya salinan terakhir yang pernah dibandingkan dan yang sebelumnya tidak terlihat oleh siapa pun.
- Angka yang terlalu panjang untuk selamat sebagai double. Dua penulisan yang berbeda dapat terurai ke nilai yang sama, dan identitas justru tempat hal itu terjadi: 12345678901234567890 dan 12345678901234567891 adalah dua bilangan bulat yang berbeda tetapi satu angka hasil penguraian, sehingga perbandingan sendirian akan menyebut sama dua dokumen yang identitasnya berbeda.
{"user": {"id": 1}, "user": {"id": 2}}Dokumen itu terurai menjadi {"user": {"id": 2}}, dan alat ini mengatakannya di bawah panel tempat ia ditempel, dengan baris dan kolom kejadian pertama serta jumlah seluruhnya. Kedua kehilangan itu tidak menghentikan perbandingan; keduanya berdiri di sampingnya. Dokumen yang sama sekali tidak dapat diurai dilaporkan di tempat yang sama, dengan letak masalahnya bila memang ada letak yang bisa diberikan, dan kedua panel dibaca secara terpisah — sehingga dua dokumen yang rusak menghasilkan dua galat sekaligus, bukan satu demi satu. Dokumen yang bersarang jauh lebih dalam daripada yang bisa digambar untuk satu nilai ditolak langsung, dan itu adalah penolakan, bukan tab yang menggantung.
Mengapa tidak ada yang Anda tempel keluar dari tab ini
Kedua dokumen tetap di peramban Anda. Tidak ada unggahan, tidak ada permintaan, dan tidak ada server yang bisa menyimpan salinannya: perbandingannya adalah hitungan yang berjalan di dalam halaman yang sudah Anda muat, dan itu pula sebabnya ia tetap bekerja ketika jaringan dimatikan. Itulah yang membuatnya aman untuk menempelkan jawaban produksi, catatan pelanggan, atau muatan bertanda tangan.
Tidak ada pula yang disimpan. Muat ulang halamannya dan kedua panel kosong; tidak ada riwayat, tidak ada akun, dan tidak ada yang perlu dihapus sesudahnya. Satu-satunya yang pernah keluar adalah apa yang Anda salin sendiri.
Pertanyaan yang sering diajukan
- Apakah urutan kunci diabaikan di sini?
- Ya, selalu, dan justru itulah sebab alat ini ada. Dua objek dengan anggota yang sama dan nilai yang sama adalah identik bagaimanapun keduanya ditulis, jadi program serialisasi yang mengeluarkan kuncinya dalam urutan berbeda pada tiap jalannya tidak pernah muncul sebagai perubahan. Indentasi, pemampatan, cara angka dieja, dan cara karakter dilolos diabaikan karena alasan yang sama, dan tidak satu pun darinya berupa setelan yang bisa Anda balik.
- Apakah anggota bernilai null sama dengan anggota yang tidak ada?
- Tidak, dan tidak ada pilihan untuk memperlakukan keduanya sama. {"note": null} terhadap {} dilaporkan sebagai $['note'] dihapus. Medan yang ada tetapi kosong adalah pernyataan yang berbeda dari medan yang tidak dikirim siapa pun — setiap bahasa skema dan setiap bahasa bertipe statis membedakan keduanya — jadi meleburnya di sini akan membuang sesuatu yang memang sedang dikatakan dokumen itu.
- Apakah [1, 2] dan [2, 1] dilaporkan sama?
- Tidak. Larik JSON itu berurutan, jadi dua larik dengan elemen yang sama dalam urutan berbeda adalah dua dokumen yang berbeda, dan menyebutnya sama berarti alat ini mengatakan sesuatu yang keliru tentang formatnya. Yang Anda peroleh adalah satu penghapusan dan satu penambahan: 1 dihapus dari depan dan ditambahkan lagi setelah 2. Objek justru sebaliknya, karena anggotanya bernama dan bukan berposisi.
- Apa arti jalur pada tiap baris?
- Itu letak perbedaannya di dalam dokumen, ditulis sebagai Jalur Ternormalkan RFC 9535: $ adalah dokumen itu sendiri, $['port'] salah satu anggotanya, dan $['hosts'][1] elemen pada indeks 1 dari larik di bawah hosts. Ia juga kueri yang bisa Anda jalankan — tempelkan ke Penguji JSONPath di situs ini bersama dokumen tempatnya berada, dan ia memilih persis simpul itu, dan tidak ada yang lain.
- Mengapa satu baris menampilkan dua jalur yang berbeda?
- Karena memasangkan dua larik bisa meninggalkan elemen yang sama pada indeks yang berbeda di tiap sisi. Bandingkan ["alpha", "beta"] dengan ["intro", "alpha", "beta!"] dan Anda mendapat dua baris: intro ditambahkan di $[0], dan beta berubah menjadi beta! — yaitu $[1] pada dokumen pertama dan $[2] pada dokumen kedua. Bila kedua jalur sama, dan biasanya memang sama, hanya satu yang ditampilkan.
- Apa maksud perubahan tipe pada baris?
- Bahwa nilainya bukan sekadar berbeda melainkan hal berjenis lain: angka yang menjadi string, nilai yang menjadi null, objek yang menjadi larik. Porta yang ditulis 8080 di satu sisi dan "8080" di sisi lain adalah kasus yang paling sering, dan biasanya berarti pembuat serial atau klienlah yang berubah, bukan datanya. Hal itu ditandai pada barisnya karena nilai yang disunting dan kontrak yang bergeser menuntut tanggapan yang berbeda dari Anda.
- Dua dokumen saya tampak identik tetapi salah satunya menulis kunci yang sama dua kali. Apa yang terjadi?
- Penguraian menyimpan salinan terakhir dan membuang yang sebelumnya, jadi perbandingan melihat satu anggota saja dan bisa saja tidak melaporkan perbedaan apa pun. Alat ini membaca teks mentahnya secara terpisah justru karena itu, dan mengatakan, di bawah panel tersebut, bahwa ada nama yang ditulis dua kali, berapa kali seluruhnya, dan di mana yang pertama berada. Pembacaan kedua yang sama menangkap bilangan bulat yang terlalu panjang untuk selamat sebagai double, yaitu cara lain dua dokumen yang berbeda dapat terurai menjadi dua yang tidak berbeda.
- Bisakah saya memperoleh tambalan yang dapat diterapkan?
- Tidak, dan itu keputusan, bukan sesuatu yang kurang. JSON Patch diterapkan satu operasi demi satu operasi, sehingga indeks di dalamnya bergeser selagi ia berjalan; mengeluarkannya berarti berjanji tentang program yang akan Anda jalankan terhadap data Anda sendiri, dan itu klaim yang jauh lebih besar daripada menggambarkan apa yang berbeda. Yang bisa Anda bawa pulang sebagai gantinya adalah laporannya sebagai teks, dari kendali salin — sama dalam tiap bahasa situs, dan tidak dipendekkan di mana pun.
- Adakah yang saya tempel dikirim ke server?
- Tidak. Kedua dokumen dibandingkan di peramban Anda dan tidak satu pun keluar darinya: tanpa unggahan, tanpa permintaan, dan tanpa apa pun yang disimpan antarkunjungan. Itulah yang membuatnya aman untuk menempelkan jawaban produksi, dan itulah sebabnya alat ini tetap bekerja ketika jaringan dimatikan. Muat ulang halamannya dan kedua panel kembali kosong.
Alat terkait
- Diff teks
Ketika perubahan yang ingin Anda lihat ada pada penulisannya, bukan pada datanya — indentasi yang dirapikan, kunci yang berpindah, atau dua berkas yang sama sekali bukan JSON — perbandingan yang menunjukkannya adalah baris per baris. Itulah persis yang dilakukan halaman itu, dengan opsi spasi dan huruf serta patch yang bisa disalin.
- Pemformat JSON
Validasi dan percantik JSON, dengan lokasi galat yang jelas.
- Pemformat SQL
Format dan percantik SQL — berbagai dialek.
- Pemformat XML
Format XML dan periksa apakah well-formed — percantik atau perkecil.