JSON Diff: İki JSON Dosyasını Online Karşılaştırın
İki JSON parçasını yapıştırın, biçimlendirin ve yan yana karşılaştırın. Doğrulama, pretty-print ve minify dahili.
JSON diff aracı nedir?
İki JSON belgesini karşılaştırmak için ücretsiz, tarayıcı içi bir araç. Eski sürümü sola, yenisini sağa yapıştırın; farklar karakter karakter belirir. Hiçbir şey makinenizden çıkmaz.
Doğrulama için tarayıcınızın yerel JSON.parse fonksiyonunu kullanır. JSON'unuz tek bir devasa minify edilmiş satırsa Format düğmesi var, tersi durum için Minify düğmesi var ve siz yazarken sözdizimi hatalarını işaretleyen canlı doğrulama mevcut.
Bir GitHub PR'ında 6.000 satırlık bir openapi.json diff'ine bakıp aşağı akış istemcisini bozan o tek alanı bulmaya çalıştıysanız, sizi oraya saniyeler içinde götüren araç budur.
Diff aslında nasıl çalışır
Diff karakter düzeyinde çalışır, ardından anlamsal son işleme ile temizlenir; böylece vurgular rastgele karakterlere değil anlamlı parçalara denk gelir. Eklemeler sağ panelde yeşil, silmeler sol panelde kırmızı görünür.
JSON'un spesifikasyonun belirttiği kendine özgü tuhaflıkları vardır. RFC 8259'daki JSON spesifikasyonu, nesneleri sırasız olarak tanımlar; dolayısıyla anahtarları yeniden sıralamak teknik olarak işlemsizdir, ancak metin diff'i bunu yine de işaretler. Bunu çözmek için her iki tarafa Format düğmesi koyduk: ikisini de biçimlendirin, sonra karşılaştırın; sıra tutarlı olur. Daha derin yapısal işler için, JSON Patch (RFC 6902)'a veya daha basit JSON Merge Patch formatına (RFC 7396) bakın; bu ikisi bir JSON değişikliğini veri olarak tanımlamanın iki standart yoludur.
Sıra hashleme veya imzalama için önemli olduğunda, ilgili spesifikasyon RFC 8785 (JSON Canonicalization Scheme)'dir. Anahtarları sıralayın, sayı biçimlendirmesini normalleştirin, sonra diff alın.
JSON'u üç adımda nasıl karşılaştırırsınız
İki metin paneli, tek bir diff. Kayıt, yükleme veya sunucu gidiş-dönüşü yok.
- 1
JSON'unuzu yapıştırın veya yükleyin
Eski JSON'u sola, yeni JSON'u sağa yapıştırın. Veya bir .json dosyasını doğrudan yüklemek için her iki tarafta da Yükle'ye tıklayın. Aracı önce iş başında görmek istiyorsanız Sample düğmesi her iki paneli de küçük bir örnekle doldurur.
- 2
Adil bir karşılaştırma için her iki tarafı da biçimlendirin
Her panelde iki boşluklu girinti ile pretty-print yapmak için Format'a tıklayın. Bu, boşluk ve satır sonlarını normalleştirir; böylece diff biçim farklılıklarını değil gerçek veri değişikliklerini vurgular. JSON'unuz temiz ayrıştırıldığında doğrulama rozeti yeşile döner.
- 3
Diff'i okuyun
Silmeler solda kırmızı vurguyla, eklemeler sağda yeşil vurguyla görünür. Bir tarafı kaydırdığınızda diğeri de takip eder. Her başlıktaki değişiklik sayıları, diff'in kaç farklı düzenleme bulduğunu söyler.
JSON diff'in doğru araç olduğu durumlar
IAM ilke değişikliklerini uygulamadan önce denetlemek
Mevcut aws iam get-policy-version çıktısını önerilen JSON ile karşılaştırarak hangi Action girişlerinin eklendiğini veya birinin daha önce belirli olan bir ifadeye gizlice "Resource": "*" eklediğini görün. AWS konsolu kaydetme sırasında ifadeleri yeniden sıralar, bu da GitHub diff'ini yanıltıcı kılar; burada her iki tarafı da biçimlendirin ve gerçek değişiklik belirgin olur.
Sessiz Terraform plan kaymasını fark etmek
terraform show -json tfplan 4 MB'lık bir blob döndürdüğünde, gözle bakmak umutsuzdur. Birinin refactor PR'ı altında eklediği aws_security_group_rule'u veya sessizce kaybolan lifecycle.ignore_changes bloğunu yüzeye çıkarmak için bugünkü planı dünkünle karşılaştırın.
OpenAPI şema değişikliklerini merge öncesi gözden geçirmek
Bir kod üreteci paths'ı alfabetik olarak yeniden sıraladığında, 6.000 satırlık bir openapi.json diff'i okunamaz. Her iki tarafı biçimlendirin, karşılaştırın ve gerçek değişiklik yüzeye çıkar: CreateOrderRequest'e eklenen bir required alanı veya şeması sessizce string'den string | null'a geçen bir 200 yanıtı.
Merge sonrası package-lock.json hata ayıklamak
Bir package-lock.json çakışmasını çözdükten sonra, geçişli bir downgrade'i yakalamak için çözümlenen dosyanızı main'in lockfile'ı ile karşılaştırın. npm bazen aynı semver aralığını farklı makinelerde farklı kesin sürümlere çözer; "benim makinemde çalışıyor, CI'de başarısız" sorununun gerçek nedeni budur. Her alanın ne anlama geldiği için package-lock.json belgelerini okuyun.
Ortamlar arası Elasticsearch eşlemelerini karşılaştırmak
Staging ve prod'dan GET /my-index/_mapping'i çekin, ikisini de diff'e bırakın. Prod'da hâlâ staging'in geçen sprintte "keyword"'e taşıdığı bir alanda "type": "text" olabilir; aggregation sorgusunun prod'da hiçbir şey döndürmemesinin ve yerelde çalışmasının nedeni budur. Eşlemeler beş veya altı seviye derin iç içe geçer ve metin diff'i bunu gürültü içine gömer.
Kararsız API mock'larını yeniden üretmek
Bir Playwright testi yerel olarak geçtiğinde ve CI'de başarısız olduğunda, testin gerçekten gördüğü JSON yanıt gövdesini yakalayın ve repo'nuzdaki fixture ile karşılaştırın. Çoğu zaman kimsenin sabitlemediği bir createdAt zaman damgası veya bir traceId alanıdır ve yapısal diff, sizi biçimlendirilmiş metin duvarına atmak yerine sorunlu anahtarı belirgin hale getirir.
JSON hızlı referans
Bu aracın en sık yüzeye çıkardığı ayrıştırma uç durumları için kısa bir kopya kağıdı. Hepsi JSON spesifikasyonuna dayanıyor.
| Topic | What this tool does |
|---|
| Nesne anahtar sırası | Spesifikasyona göre sırasız. {"a":1,"b":2}, {"b":2,"a":1}'e eşittir. Diff almadan önce normalleştirmek için Anahtarları sırala'yı kullanın. |
|---|
| Dizi sırası | Sıralı. [1,2,3], [3,2,1]'e eşit değil. Sıra sizin durumunuz için önemli değilse manuel olarak sıralayın. |
|---|
| Sondaki virgüller | İzin verilmiyor. { "a": 1, } standart JSON'da bir parse hatasıdır. JSON5/JSONC'de izin verilir, bunlar üst kümedir — önce kaldırın. |
|---|
| Yorumlar | İzin verilmiyor. // böyle bir parse hatasıdır. JSON5 ve JSONC kabul eder; bu araç katı RFC 8259 dilbilgisini takip eder. |
|---|
| Sayılar | 64-bit IEEE 754 float olarak ayrıştırılır. 0.1 + 0.2 = 0.30000000000000004. 2^53 − 1 üzerindeki tam sayılar hassasiyet kaybeder; snowflake ID'leri string olarak saklayın. |
|---|
| Yinelenen anahtarlar | Spesifikasyon bunu tanımsız davranış olarak adlandırır. Çoğu ayrıştırıcı son oluşumu tutar. Diff hepsini gösterir; bu, yapılandırma dosyalarını denetlerken genellikle istediğiniz şeydir. |
|---|
| Kodlama | Yalnızca UTF-8. RFC 8259, belge başında bir UTF-8 BOM'u yasaklar; bazı ayrıştırıcılar yine de kabul eder, ancak spesifikasyon kabul etmez. |
|---|
| Null ile eksik | null değerli bir anahtar mevcuttur. Eksik bir anahtar yoktur. JSON karşılığı olmayan JavaScript'in undefined'ından farklıdır. |
|---|
JSON diff: sıkça sorulan sorular
JSON'umu kaydediyor veya bir yere yüklüyor mu?
Hayır. Diff tamamen tarayıcınızda çalışır. Hiçbir şey sunucuya gönderilmez, kaydedilmez veya saklanmaz. İçerideki bir API yanıtını veya bir IAM ilkesini yapıştırıp sekmeyi kapatın; geride kopya kalmaz. Doğrulamak için DevTools'u açın, Network sekmesine geçin ve izleyin — karşılaştırma yaptığınızda giden istek yoktur.
Anahtarları yeniden sıralamak veya JSON'u pretty-print yapmak değişiklik olarak görünür mü?
Evet, ikisi de görünür. Bir metin diff'i karakterleri satır satır karşılaştırır, dolayısıyla yeniden biçimlendirme, anahtarların yeniden sıralanması veya boşluk değişiklikleri veriler aynı olsa bile fark olarak görünür. Her iki panelde de Format düğmesine tıklayarak önce pretty-print yapın; diff gerçek veri değişikliklerine odaklanır. Anahtar sırasını yok sayan tamamen yapısal bir karşılaştırma için, diff almadan önce her iki taraftaki anahtarları sıralayın.
Bir JSON nesnesindeki anahtarların sırası önemli mi?
Nesne anahtarları için önemli değil — JSON spesifikasyonu nesnelerin sırasız olduğunu söyler, bu nedenle {"a":1,"b":2} ve {"b":2,"a":1} aynı veriyi temsil eder. Karakter diff'i yine de yeniden sıralamayı işaretler, bu yüzden Format düğmesi önemlidir. Diziler farklıdır: [1,2,3] ve [3,2,1] eşit değildir çünkü dizi sırası JSON'da anlamlıdır.
Neden 0.1 + 0.2 diff'imde 0.3'e eşit değil?
IEEE 754 kayan noktalı sayı yüzünden. 0.1 + 0.2 aslında 0.30000000000000004'tür ve JSON.parse sayıları 64-bit float olarak okur. Büyük tam sayılar aynı sınıra çarpar: 2^53 - 1 (9007199254740991) üzerindeki her şey hassasiyet kaybeder, dolayısıyla Twitter tarzı bir snowflake ID gidip dönmez. Hassasiyet önemliyse, bunları string olarak saklayın.
Yorumlu veya sondaki virgüllü JSON yapıştırabilir miyim?
Standart JSON ikisine de izin vermez. { "a": 1, } veya // yorum size bir parse hatası verir. Bu JSON5 veya JSONC'dir (VS Code'un settings.json için kullandığı format), ki bunlar üst kümedir. Önce yorumları ve sondaki virgülleri kaldırın. Diff'in API'nizin gerçekten kabul ettiğiyle eşleşmesi için bilerek katı RFC 8259 dilbilgisini takip ediyoruz.
Ne kadar büyük bir JSON dosyasını yavaşlamadan diff'leyebilirim?
Birkaç MB'a kadar gayet iyi, saniye altı. 10 MB'ı geçince tarayıcı bunu hissetmeye başlar, çoğunlukla diff'i hesaplamak değil oluşturmak pahalı hale geldiği için. 50 MB+ dışa aktarmalar için, önce her iki tarafı jq ile ilgilendiğiniz alt ağaca filtreleyin, sonra onu yapıştırın.
Gizlilik ve bunun nasıl çalıştığı
JSON'unuz tarayıcınızdan asla çıkmaz. Ayrıştırıcı, biçimlendirici ve diff hepsi makinenizde, yerel olarak çalışır. Girdinize ilişkin analitik yok, log yok, "yardımcı" bulut gidiş-dönüşü yok. Ayrıştırma tarayıcının yerel JSON.parse'ını kullanır ve takip ettiğimiz JSON spesifikasyonu RFC 8259'dur.