Diff Checker

JSON Nesnelerini Karşılaştırma: JSON Diff Aracı

İki JSON belgesini karşılaştırarak eklenen, kaldırılan ve değiştirilen anahtarları bulun. Temiz satır satır karşılaştırma için önce her iki girdiyi de biçimlendirin.

Verileriniz tarayıcınızdan çıkmaz.

Diff görmek için iki alana da metin gir

Bu İki Belge Arasında Ne Değişti

Orijinal ve değiştirilmiş nesne arasındaki diff beş değişiklik gösterir:

name, settings.notifications ve genel yapı aynı kaldı.

Metinsel vs Anlamsal JSON Diff

Metinsel bir diff, iki belgeyi string olarak satır satır karşılaştırır. Bu, her iki belge de tutarlı bir şekilde biçimlendirildiğinde (aynı girinti, aynı anahtar sırası) iyi çalışır. İki belge arasında anahtar sırası farklıysa, metinsel bir diff, veri aynı olsa bile her satırı değişmiş olarak işaretler.

Anlamsal bir diff, önce her iki belgeyi ayrıştırır, ardından veri yapılarını karşılaştırır. Anahtar sırası, boşluk veya girinti ile ilgilenmez. Değişiklikleri yollar ve değerler cinsinden bildirir: age 30’dan 31’e değişti, 3. satır değişti değil.

Farklı kaynaklardan (farklı API’ler, farklı serileştiriciler) JSON belgelerini karşılaştırmak için anlamsal diff daha güvenilirdir. Biçimlendirmenin tutarlı olduğu sürüm kontrolünde bir JSON dosyasındaki değişiklikleri izlemek için metinsel diff (burada gösterildiği gibi) iyi çalışır ve hemen okunabilir.

JSON’ı Temiz Bir Metinsel Diff İçin Hazırlama

İki JSON belgesini metin olarak diff’lemeden önce, her ikisini de aynı ayarlarla biçimlendirin. Tutarsız girinti veya anahtar sıralaması, her satırın değişmiş göründüğü gürültülü diff’ler üretecektir.

Tutarlı girinti ile jq kullanarak biçimlendirme:

jq --sort-keys . original.json > original_formatted.json
jq --sort-keys . modified.json > modified_formatted.json
diff original_formatted.json modified_formatted.json

--sort-keys bayrağı, nesne anahtarlarını alfabetik olarak sıralar. Her iki belge de aynı şekilde sıralanırsa, anahtar sırası farklılıkları diff’te yanıltıcı değişiklikler olarak görünmez.

JSON Patch Formatı (RFC 6902)

Bu iki belge arasındaki değişiklikler bir JSON Patch belgesi olarak ifade edilir:

[
  {"op": "replace", "path": "/age", "value": 31},
  {"op": "replace", "path": "/email", "value": "alice@newdomain.com"},
  {"op": "add", "path": "/roles/2", "value": "viewer"},
  {"op": "replace", "path": "/settings/theme", "value": "light"},
  {"op": "add", "path": "/settings/language", "value": "en"}
]

JSON Patch, tam belge yerine yalnızca değiştirilen alanları göndermek istediğiniz API güncelleme uç noktaları için kullanışlıdır. test işlemi, değişiklikleri geçerli bir değere bağlı hale getirmenize olanak tanır ve iyimser eşzamanlılık kontrolü sağlar.

JSON Merge Patch Formatı (RFC 7396)

Aynı değişiklikler bir JSON Merge Patch olarak ifade edilir:

{
  "age": 31,
  "email": "alice@newdomain.com",
  "roles": ["admin", "editor", "viewer"],
  "settings": {
    "theme": "light",
    "language": "en"
  }
}

Merge Patch daha basittir ancak daha az keskindir. Tam diziyi yeniden göndermeden dizi öğesi eklemelerini ifade edemez. Anahtar silme sinyali vermek için null kullanır. Dizi işleme olmadan basit nesneler için Merge Patch oluşturması ve okuması daha kolaydır.

JSON Diff İçin CLI Araçları

jd

jd, yol tabanlı anlamsal çıktı üreten özel bir JSON diff aracıdır:

jd original.json modified.json

Çıktı:

@ ["age"]
- 30
+ 31
@ ["email"]
- "alice@example.com"
+ "alice@newdomain.com"
@ ["roles",2]
+ "viewer"
@ ["settings","language"]
+ "en"
@ ["settings","theme"]
- "dark"
+ "light"

Her @ satırı, değiştirilen değerin yolunu gösterir. Bu format, iç içe değişiklikleri hemen netleştirir.

jq ile diff

Yalnızca standart araçları kullanan hızlı bir karşılaştırma:

diff <(jq --sort-keys . original.json) <(jq --sort-keys . modified.json)

Bu, standart bir metinsel diff çalıştırmadan önce her iki dosyayı biçimlendirir ve sıralar, ek bir araç yüklemeden size temiz satır satır çıktı verir.

Python deepdiff

Python’da betik tabanlı JSON karşılaştırması için:

from deepdiff import DeepDiff
import json

with open("original.json") as f:
    original = json.load(f)
with open("modified.json") as f:
    modified = json.load(f)

diff = DeepDiff(original, modified)
print(diff)

deepdiff, tutarlı anahtar sırası veya biçimlendirme gerektirmeden iç içe yapıları, tür değişikliklerini ve liste öğesi eklemelerini işler.