Was sich zwischen diesen beiden Dokumenten geändert hat
Der Diff zwischen den Original- und den geänderten Objekten zeigt fünf Änderungen:
agehat sich von30auf31geändertemailhat sich vonalice@example.comaufalice@newdomain.comgeändertroleshat ein drittes Element erhalten:viewersettings.themehat sich vondarkauflightgeändertsettings.languagewurde mit dem Wertenhinzugefügt
Textuelles vs. semantisches JSON-Diff
Ein textuelles Diff vergleicht die beiden Dokumente als Strings, Zeile für Zeile. Es funktioniert gut, wenn beide konsistent formatiert wurden. Wenn sich die Schlüsselreihenfolge zwischen den beiden Dokumenten unterscheidet, markiert ein textuelles Diff jede Zeile als geändert.
Ein semantisches Diff interpretiert zuerst beide Dokumente und vergleicht dann die Datenstrukturen. Es kümmert sich nicht um Schlüsselreihenfolge, Leerzeichen oder Einrückung.
JSON für ein sauberes textuelles Diff vorbereiten
jq --sort-keys . original.json > original_formatted.json
jq --sort-keys . modified.json > modified_formatted.json
diff original_formatted.json modified_formatted.json
JSON-Patch-Format (RFC 6902)
[
{"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"}
]
CLI-Tools für JSON-Diff
jd
jd original.json modified.json
jq mit diff
diff <(jq --sort-keys . original.json) <(jq --sort-keys . modified.json)