JSON farkı

İki JSON belgesini karşılaştırın ve neyin eklendiğini, silindiğini ve değiştiğini görün. Anahtar sırası, girinti ve küçültme sayılmaz; veri tarayıcıdan çıkmaz.

Birinci JSON
İkinci JSON
Sonuç

Karşılaştırmak için iki bölmeye de JSON yapıştırın

Metni değil, veriyi karşılaştırmak

Satır satır karşılaştırma, yazılışa dair bir soruyu yanıtlar: bu dosyanın hangi satırları şu dosyanın satırı değil. Düz metin ve kaynak kodu için doğru soru budur; JSON için yanlış sorudur, çünkü bir JSON belgesinin tek bir doğru yazılışı yoktur. Bir nesnenin üyelerini yeniden sıralayın, girintiyi değiştirin ya da bir tarafı küçültün: bütün satırlar değişir, veriler ise hiç kımıldamaz. Bu araç, iki belgenin ayrıştırıldığında neye dönüştüğünü karşılaştırır; dolayısıyla bildirdiği şey gerçekten değişmiş olandır. Aşağıda aynı belge iki kez yazılmış: ilk satırda küçültülmüş, sonra biçimlendirilmiş ve üyeleri başka bir sırada.

{"name":"checkout","port":8080,"tags":["a","b"]}

{
  "port": 8080,
  "tags": ["a", "b"],
  "name": "checkout"
}

O ikisinin tek bir ortak satırı yok, ve bu araç aralarında hiçbir fark bildirmiyor: aynı üyeler, aynı değerler, dizinin içinde aynı sıra. Bunun pratik sonucu şu: karşılaştırma yürüsün diye bir belgeyi hiçbir zaman yeniden biçimlendirmeniz gerekmez — ki bu, tam da karşılaştırmaya oturduğunuz şeyi değiştirmek olurdu.

Hiçbir zaman fark sayılmayanlar

Bir belgenin nasıl yazıldığına dair dört şey yok sayılır, üstelik koşulsuz yok sayılır. Bunlardan herhangi birini geri açan bir denetim yoktur, çünkü bunu yapabilen bir araç, açıklanması gereken iki anlamı olan iki araç olurdu ve okuyanın, önündeki yanıtı hangisinin ürettiğini bilmesi gerekirdi.

  • Bir nesnenin üyelerinin yazılış sırası. {"a": 1, "b": 2} ile {"b": 2, "a": 1} aynı veriyi taşır; dolayısıyla anahtarlarını her çalıştırmada başka sırada üreten bir serileştirici burada hiçbir zaman değişiklik olarak görünmez.
  • Her türden boşluk — girinti, satır sonları, iki noktadan sonraki boşluk. Aynı veriyi taşıyan küçültülmüş bir belge ile biçimlendirilmiş bir belge, aynı belgenin iki hâlidir.
  • Bir sayının yazılış biçimi. 1e3 aslında 1000, 1.50 ise 1.5’tir; çünkü bir JSON sayısının değeri vardır, yazılışı yoktur: yalnızca orada ayrılan iki belge aynı sayıları taşır ve onlar hakkında hiçbir şey bildirilmez.
  • Bir dizgenin içindeki bir karakterin nasıl kaçırıldığı. \u0041 diye yazılan altı karakter ile A harfi, tek karakterlik aynı dizgedir.

O listeye ait görünen iki şey ise bilerek listede değil. Bir dizinin öğelerinin sırası veridir — [1, 2] ile [2, 1] ayrı belgelerdir — ve değeri null olan bir üye, hiç bulunmayan bir üyeyle aynı şey değildir; bu yüzden biri diğerine karşı sessizce geçiştirilmek yerine bildirilir.

Eklendi, silindi, değişti — bir de tür değişimi

Sonucun her satırı tam olarak üç türden biridir ve üçü birlikte karşılaştırmanın bulabileceği her şeyi kapsar. Şu iki belgeyi ele alın:

{"host":"api.example.com","port":8080,"debug":true}

{"host":"api.example.com","port":"8080","retries":3}
  • $['port'] konumunda değişti: üye iki belgede de var ve değeri aynı değil, bu yüzden iki değer de gösterilir. Bu satır ayrıca tür değişimi olarak işaretlenir, çünkü 8080 bir sayı, "8080" ise bir dizgedir.
  • $['debug'] konumunda silindi: üye birinci belgede var, ikincisinde yok.
  • $['retries'] konumunda eklendi: üye ikinci belgede var, birincisinde yok.

host adlı üye ikisinde de aynı değerle duruyor, bu yüzden hiç bildirilmez. Tür değişimi, bir değişikliğin özelliğidir; dördüncü bir satır türü değildir: bir şemanın fark ettiği, iki dosyayı okuyan bir insanın çoğunlukla fark etmediği kayma odur, bu yüzden sizin görmenize bırakılmak yerine gerçekleştiği yerde söylenir.

Bir farkın nerede durduğu, yol olarak yazılmış

Her satır durduğu yeri adlandırır, ve onu satır numarası olarak değil belgenin içine giden bir yol olarak adlandırır — satır numarası, yazılışa dair bir olgu olurdu, yani bu aracın az önce yok saymayı bitirdiği şey. Yollar RFC 9535 normalleştirilmiş yollarıdır; JSON içindeki bir konumun yazıya dökülmesi gereken her yerde bu sitenin kullandığı tek yazılış budur.

  • $ belgenin tamamıdır, $['port'] onun içindeki port adlı üyedir, $['hosts'][1] ise hosts altındaki dizinin 1 numaralı öğesidir. Bir üye her zaman köşeli ayraç ve tırnak içinde yazılır; bu yüzden içinde nokta, boşluk ya da kendi ayracı bulunan bir ad özel bir şey gerektirmez.
  • Bir yol, çalıştırabileceğiniz bir sorgudur. Ait olduğu belgeyle birlikte bu sitedeki JSONPath test aracına yapıştırın: tam olarak o düğümü seçer, ki bir farkı çevresiyle birlikte okumanın en hızlı yolu budur.
  • Bu, düğümün gerçekten içinde bulunduğu belgeye karşı bir sorgudur: eklenmiş bir üyenin yolu ikinci belge üzerinde, silinmiş bir üyeninki birinci belge üzerinde çalışır. Buradaki hiçbir şey var olmayan bir düğümü adlandırmaz.

Değişmiş bir satır iki yol taşıyabilir; bu, bir sonraki bölümdeki eşleştirmenin dışa vurmasıdır: bir dizi bir öğe kazandığı ya da kaybettiği anda, aynı öğe her iki tarafta başka bir sırada durur. İki yolun aynı olduğu yerde — ki neredeyse her zaman öyledir — yalnızca biri gösterilir.

İki dizi nasıl eşleştirilir

İki nesne üye üye karşılaştırılır; bu kolaydır, çünkü bir üyenin adı vardır. İki dizinin adı yoktur, yalnızca konumları vardır, ve onları konum konum karşılaştırmak çoğu karşılaştırma çıktısını okunmaz kılan şeydir: uzun bir dizinin başına bir kayıt ekleyin, artık hiçbir şey eskiden bulunduğu yerde değildir; konumu kimlik olarak okuyan bir karşılaştırma dizinin tamamını farklı diye bildirir — dar anlamda doğru, başka her anlamda yararsız. Bu yüzden öğeler önce eşleştirilir, sizin göstereceğiniz bir alana göre değil ne olduklarına göre, ve yalnızca eşleştirmeden artan bildirilir.

{"hosts": ["alpha", "beta", "gamma"]}

{"hosts": ["alpha", "staging", "beta", "gamma"]}

Bu tek bir satırdır: staging, $['hosts'][1] konumuna eklendi. beta ve gamma adlı öğeler birer basamak kaydı ve anılmıyorlar, çünkü kaymak değişmek değildir. Bir dizinin bir öğesi içinde düzenlenmiş tek bir alanın, öğenin tamamı başkasıyla değiştirilmiş gibi değil de o alandaki bir değişiklik olarak bildirilmesini sağlayan da aynı eşleştirmedir.

Sıra hâlâ sayılır ve eşleştirme bunun tersini iddia etmez: [1, 2] ile [2, 1] karşılaştırıldığında sonuç, baştan silinen bir 1 ile 2’den sonra eklenen bir 1’dir — olan tam olarak budur. İki dizi, eşleştirmeye değmeyecek kadar farklı da olabilir; o noktadan sonra karşılaştırma konum konum ilerlemeye geri döner ve bunu sonucun en üstünde söyler, böylece gürültülü bir yanıt gizemli kalmak yerine açıklanmış olur.

Rapor ile ağaç

Aynı karşılaştırma iki sunumda verilir ve aralarında geçiş yapmak hiçbir şeyi yeniden hesaplamaz: ağaç, raporun sıraladığı farkların tam da o listesinden çizilir, dolayısıyla ikisi neyin değiştiği ya da ne kadarının değiştiği konusunda ayrı düşemez.

  • Rapor, neyin değiştiğini yanıtlar: fark başına bir satır, her biri kendi yolunu, türünü ve her iki taraftaki değerini taşır. Listenin tamamını önünüzde görmek istediğinizde göz gezdirilecek görünüm budur.
  • Ağaç, belgenin neresinde sorusunu yanıtlar: iki belge tek bir taslakta birleştirilir ve yalnızca fark taşıyan parçalar açık durur. İçinde hiçbir şey bulunmayan ardışık çocuklardan oluşan her dizi, kaç tanesinin yerine geçtiğini söyleyen tek bir satıra katlanır — yukarıdaki bölümün çifti beş satır olarak çizilir: belge, içindeki dizi, bir öğenin yerine geçen katlanmış bir satır, eklenen öğe ve iki öğenin yerine geçen katlanmış bir satır.
  • Sonucun başlığının yanındaki sayı, var olan bütün farklardır. Ekrandaki liste uzunluk yüzünden kısaltıldığında o sayı kımıldamaz ve listenin dibindeki bir denetim geri kalanını gösterir.
~! $['port'] 8080 -> "8080"
- $['debug'] true
+ $['retries'] 3

Kopyalama denetiminin, üçüncü bölümdeki iki belge için ürettiği şey budur: tür için bir işaret, sonra yol, sonra aralarında bir okla değerler — eklenen üye için artı, silinen üye için eksi, bir değişiklik için tilde, türün de değiştiği yerde ünlem işaretli tilde. Sözcük yerine simgeyle yazılması bilinçlidir: yapıştırılan bir sonuç, sitenin hangi dilinde okuyor olursanız olun aynı metin olsun diye. Ve hiçbir şeyi kısaltmaz: ekranın kestiği bir değer orada tam hâliyle durur.

Ayrıştırmanın bedeli ve aracın yüksek sesle söyledikleri

İki belgenin ayrıştırıldığında neye dönüştüğünü karşılaştırmak, ayrıştırmanın bedeliyle yaşamak demektir; JSON ayrıştırmak ise kayıpsız değildir. Bu, sitenin başka hiçbir yerinde olmadığı kadar burada ağır basar, çünkü bir karşılaştırma aracının en az göze alabileceği yanıt, gerçekten ayrılan iki belge için «fark yok» demektir. Bu yüzden her bölmenin metni ikinci kez metin olarak okunur ve ayrıştırmanın düşürdüğü şey yutulmak yerine karşılaştırmanın yanında bildirilir.

  • Aynı nesnede iki kez yazılmış bir üye adı. Ayrıştırmadan yalnızca sonraki kopya sağ çıkar; dolayısıyla karşılaştırılan da yalnızca sonraki kopyadır ve öncekini kimse görmemiştir.
  • Bir double olarak sağ çıkamayacak kadar uzun bir sayı. İki ayrı yazım aynı değere ayrıştırılabilir ve bunun olduğu yer tam olarak kimliklerdir: 12345678901234567890 ile 12345678901234567891 ayrı tam sayılardır ama tek bir ayrıştırılmış sayıdır, öyle ki karşılaştırma tek başına, kimlikleri farklı olan iki belgeyi aynı sayardı.
{"user": {"id": 1}, "user": {"id": 2}}

O belge {"user": {"id": 2}} olarak ayrıştırılır ve araç bunu, yapıştırıldığı bölmenin altında, ilk örneğin satırı ve sütunuyla ve toplamda kaç tane olduğuyla birlikte söyler. Kayıpların ikisi de karşılaştırmayı durdurmaz; ikisi de onun yanında durur. Hiç ayrıştırılamayan bir belge de aynı yerde bildirilir, verilecek bir konum bulunduğu her durumda sorunun konumuyla birlikte, ve iki bölme birbirinden bağımsız okunur — böylece bozuk iki belge, biri diğerinin ardından değil, aynı anda iki hata üretir. Bir değerin çizilebileceğinden çok daha derine yuvalanmış bir belge doğrudan geri çevrilir; bu bir geri çevirmedir, donmuş bir sekme değil.

Yapıştırdığınız hiçbir şey neden bu sekmeden çıkmaz

İki belge de tarayıcınızda kalır. Yükleme yok, istek yok ve bir kopya tutabilecek sunucu yok: karşılaştırma, zaten yüklemiş olduğunuz sayfanın içinde çalışan bir aritmetiktir — ağ kapalıyken de çalışmayı sürdürmesinin nedeni budur. Buraya bir üretim yanıtını, bir müşteri kaydını ya da imzalı bir yükü yapıştırmayı güvenli kılan şey de budur.

Hiçbir şey saklanmaz da. Sayfayı yenileyin, iki bölme de boştur; geçmiş yok, hesap yok ve sonradan silinecek bir şey yok. Buradan çıkan tek şey, kendi kopyaladığınızdır.

Sıkça sorulan sorular

Bu araç anahtar sırasını yok sayıyor mu?
Evet, her zaman, ve aracın var olma nedeni de budur. Aynı üyeleri aynı değerlerle taşıyan iki nesne, nasıl yazılmış olurlarsa olsunlar aynıdır; dolayısıyla anahtarlarını her çalıştırmada başka sırada üreten bir serileştirici hiçbir zaman değişiklik olarak görünmez. Girinti, küçültme, bir sayının yazılışı ve bir karakterin nasıl kaçırıldığı da aynı nedenle yok sayılır ve bunların hiçbiri tersine çevirebileceğiniz bir ayar değildir.
null değerli bir üye ile hiç bulunmayan bir üye aynı şey mi?
Hayır, ve ikisini aynı saymak için bir seçenek yok. {"note": null} ile {} karşılaştırıldığında $['note'] silindi diye bildirilir. Var olan ve boş bir alan, kimsenin göndermediği bir alandan başka bir şey söyler — her şema dili ve statik türlü her dil ikisini ayırır — dolayısıyla burada onları birleştirmek, belgelerin gerçekten söylediği bir şeyi çöpe atmak olurdu.
[1, 2] ile [2, 1] aynı diye mi bildirilir?
Hayır. JSON dizisi sıralıdır; aynı öğeleri başka bir sırada taşıyan iki dizi ayrı iki belgedir ve onlara eşit demek, bu aracın biçim hakkında yanlış bir şey söylemesi olurdu. Aldığınız şey bir silme ile bir eklemedir: 1 baştan silinmiş ve 2’den sonra yeniden eklenmiştir. Nesnelerde durum tersinedir, çünkü onların üyeleri konumlandırılmış değil adlandırılmıştır.
Her satırdaki yol ne anlama geliyor?
Farkın belge içinde durduğu yerdir, RFC 9535 normalleştirilmiş yolu olarak yazılmıştır: $ belgenin kendisi, $['port'] onun bir üyesi, $['hosts'][1] ise hosts altındaki dizinin 1 numaralı öğesidir. Aynı zamanda çalıştırabileceğiniz bir sorgudur — ait olduğu belgeyle birlikte bu sitedeki JSONPath test aracına yapıştırın: tam olarak o düğümü seçer, başka hiçbir şeyi değil.
Bir satır neden iki farklı yol gösterdi?
Çünkü iki diziyi eşleştirmek, aynı öğeyi her iki tarafta başka bir sırada bırakabilir. ["alpha", "beta"] ile ["intro", "alpha", "beta!"] karşılaştırıldığında iki satır alırsınız: intro, $[0] konumuna eklendi ve beta, beta! oldu — ki bu birinci belgede $[1], ikincisinde $[2] demektir. İki yolun aynı olduğu yerde, ki genellikle aynıdır, yalnızca biri gösterilir.
Bir satırdaki tür değişimi ne demek?
Değerin yalnızca farklı olmadığı, başka türden bir şey olduğu demektir: dizgeye dönüşmüş bir sayı, null’a dönüşmüş bir değer, diziye dönüşmüş bir nesne. Bir tarafta 8080, öbür tarafta "8080" yazılmış bir bağlantı noktası en sık görülen durumdur ve genellikle verinin değil bir serileştiricinin ya da bir istemcinin değiştiği anlamına gelir. Satırda işaretlenir, çünkü düzenlenmiş bir değer ile kayan bir sözleşme sizden farklı karşılıklar ister.
İki belgem aynı görünüyor ama biri aynı anahtarı iki kez yazıyor. Ne olur?
Ayrıştırma sonraki kopyayı tutar ve öncekini düşürür; dolayısıyla karşılaştırma tek bir üye görür ve pekâlâ hiçbir fark bildirmeyebilir. Araç ham metni tam da bunun için ayrıca okur ve o bölmenin altında bir adın iki kez yazıldığını, toplamda kaç kez olduğunu ve ilkinin nerede bulunduğunu söyler. Aynı ikinci okuma, bir double olarak sağ çıkamayacak kadar uzun bir tam sayıyı da yakalar; bu da ayrılan iki belgenin ayrılmayan ikiye ayrıştırılabilmesinin öteki yoludur.
Uygulayabileceğim bir yama alabilir miyim?
Hayır, ve bu eksik bir şey değil, bir karardır. JSON Patch bir işlemin ardından öteki uygulanır, dolayısıyla içindeki sıra numaraları çalıştıkça kayar; böyle bir şey üretmek, kendi verinize karşı çalıştıracağınız bir program hakkında söz vermektir, ki bu neyin ayrıldığını betimlemekten çok daha büyük bir iddiadır. Bunun yerine yanınızda götürebileceğiniz şey, kopyalama denetiminden alınan metin hâlindeki rapordur — sitenin her dilinde aynı ve hiçbir yerinde kısaltılmamış.
Yapıştırdığım herhangi bir şey bir sunucuya gönderiliyor mu?
Hayır. İki belge de tarayıcınızda karşılaştırılır ve hiçbiri oradan çıkmaz: yükleme yok, istek yok ve ziyaretler arasında saklanan hiçbir şey yok. Buraya bir üretim yanıtı yapıştırmayı güvenli kılan budur ve aracın ağ kapalıyken de çalışmasının nedeni budur. Sayfayı yenileyin, iki bölme yeniden boş olur.

İlgili araçlar

  • Metin farkı

    Görmek istediğiniz değişiklik veride değil yazılışta olduğunda — bir girinti geçişi, yeri değişmiş bir anahtar ya da hiç JSON olmayan iki dosya — onu gösteren karşılaştırma satır satır olanıdır. O sayfanın yaptığı tam olarak budur: boşluk ve büyük/küçük harf seçenekleri ve kopyalanabilir bir yama.

  • JSON biçimlendirici

    JSON'u doğrulayın ve güzelleştirin, hata konumları net.

  • SQL biçimlendirici

    SQL'i biçimlendirin ve güzelleştirin — birden çok lehçe.

  • XML biçimlendirici

    XML'i biçimlendirin ve söz dizimini kontrol edin — güzelleştirin veya küçültün.