İ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 her ikisini de biçimlendirin.
Diff görmek için iki alana da metin gir
Orijinal ve değiştirilmiş nesne arasındaki diff beş değişiklik gösterir:
age 30’dan 31’e değiştiemail alice@example.com’dan alice@newdomain.com’a değiştiroles üçüncü bir öğe kazandı: "viewer"settings.theme "dark"’tan "light"’a değiştisettings.language "en" değeriyle eklendiname, settings.notifications ve genel yapı aynı kaldı.
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.
İ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.
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.
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.
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.
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’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.
Nothing you paste leaves this tab. Every tool runs entirely in your browser — no upload, no server, no account.