İki JSON belgesi normal bir metin diff'i ile (kod için kullanılan türden) karşılaştırıldığında, sonuç genellikle yanıltıcı olur: aynı veriler farklı bir anahtar sırasıyla, farklı girintiyle veya farklı sayıda boşlukla yazılabilir — ve metin diff'i, verilerin aslında aynı olduğu yerde bir "fark" gösterir.
Yapısal karşılaştırma
Yapısal bir JSON Diff, her iki belgeyi de bir değer ağacına ayrıştırır ve gerçek verileri karşılaştırır: bir alan var mı, hangi değeri tutuyor, tür eşleşiyor mu. Bir nesnenin anahtar sırası, fazladan boşluklar veya girinti stili burada dikkate alınmaz — bunlar verinin kendisinin bir parçası değildir.
Diff ne gösterir
Tipik bir yapısal karşılaştırma sonucu üç tür değişikliği vurgular: ikinci belgede eklenen alanlar, birinciden kaldırılan alanlar ve her ikisinde de bulunan ama farklı değerlere sahip alanlar. Diziler için karşılaştırma daha karmaşıktır — öğeleri konuma göre mi karşılaştıracağınıza yoksa benzer nesneleri eşleştirmeye mi çalışacağınıza karar vermeniz gerekir.
Buna neden ihtiyaç duyulur
- Verilerdeki gerçek değişiklikleri görmek için backend'de bir değişiklikten önce ve sonra bir API yanıtını karşılaştırmak.
- Bir yapılandırma dosyasındaki bir değişikliğin beklenmedik bir şeyi etkilemediğini doğrulamak.
- Beklenen ve gerçek JSON'un farklı olduğu testlerde bir gerilemeyi tespit etmek.
Otomatik diff betikleri Türkçe sunucularda neden anahtar kaçırır
Bazı diff araçları, anahtarları karşılaştırmadan önce büyük/küçük harfe duyarsız hale getirmek için dahili olarak toUpperCase() ya da benzeri bir dönüşüm uygular. Böyle bir betik Türkçe sistem yerel ayarıyla (tr_TR) çalışan bir sunucuda yürütülürse, küçük "i" harfi beklenen "I" yerine noktalı "İ" harfine dönüşür — sonuç olarak "id" anahtarı "İD"'ye eşlenir ve diğer belgedeki "ID" ile eşleşmeyip yanlışlıkla "eksik anahtar" olarak raporlanabilir. Bu, dil ayarına bağlı sessiz karşılaştırma hatalarının klasik bir örneğidir.
Dizi karşılaştırması: konuma göre mi, anahtara göre mi
En basit yaklaşım, dizi öğelerini indeks indeks karşılaştırmaktır, ancak dizinin ortasına yeni bir öğe eklendiğinde sonraki tüm konumlar "kayar" ve diff, ekleme noktasından sonraki her öğede bir değişiklik gösterir — oysa gerçekte yalnızca bir öğe değişmiştir. Daha akıllı araçlar, gerçek bir eklemeyi veya kaldırmayı, yanlış değişikliklerin bir dizisi yerine doğru şekilde göstermek için öğeleri benzersiz bir alana (örneğin id) göre eşleştirmeye çalışır.