HandyTools Hub

JSON-Diff

Vergleichen Sie zwei JSON-Objekte und finden Sie Unterschiede sofort

Zwei JSON-Dokumente mit bloßem Auge zu vergleichen, wird unzuverlässig, sobald sie mehr als ein paar Zeilen umfassen: Umsortierte Schlüssel und unterschiedliche Einrückung verbergen die Änderungen, auf die es ankommt. Dieses Tool parst beide Seiten, durchläuft sie rekursiv und meldet nur echte Unterschiede – jeweils mit einem Pfad.

So funktioniert der Vergleich

Beide Eingaben werden mit JSON.parse geparst. Die oberste Ebene muss jeweils ein Objekt sein; Arrays und primitive Werte an der Wurzel werden abgelehnt. Danach bildet das Tool auf jeder Ebene die Vereinigung der Schlüssel und läuft sie durch.

  • Ist ein Schlüssel auf beiden Seiten vorhanden und sind beide Werte einfache Objekte, wird in das Objekt hineinrekursiert, statt es als Blatt zu behandeln.
  • Alles andere – primitive Werte, Arrays, null und jeder nur auf einer Seite vorhandene Schlüssel – wird als Blatt mit tiefer Gleichheit verglichen.
  • Fehlende Schlüssel werden als undefined geführt: ein Schlüssel nur links ist entfernt, ein Schlüssel nur rechts ist hinzugefügt, ein Schlüssel auf beiden Seiten mit ungleichen Werten ist geändert.
  • Pfade werden mit Punkten verbunden, ein verschachtelter Schlüssel wird also zu address.city.
  • Zum Schluss werden alle Einträge alphabetisch nach Pfad sortiert und vier Zähler erzeugt.

Weil in Arrays nie hineinrekursiert wird, behandelt das Tool ein ganzes Array als einen Wert. Zwei Arrays sind nur dann gleich, wenn ihre Längen übereinstimmen und jedes Element tief gleich ist.

Verwendung

  1. Original-JSON einfügen – fügen Sie das Ausgangs-JSON in den linken Editor ein. Die Seite ist mit einem kleinen Beispiel vorbelegt, damit Sie das Verhalten sofort sehen.
  2. Geändertes JSON einfügen – fügen Sie die zweite Fassung in den rechten Editor ein.
  3. Vergleichen klicken. Vor dem Klick läuft nichts.
  4. Ergebnisse lesen. Grün bedeutet hinzugefügt, Rot entfernt, Gelb geändert und Grau unverändert. Geänderte Einträge zeigen den alten Wert durchgestrichen, gefolgt vom neuen Wert.

Ungültiges JSON auf einer der Seiten erzeugt einen Parserfehler, der die betroffene Seite nennt – ein überzähliges Komma oder ein fehlendes Anführungszeichen ist damit schnell zu finden.

Praxisbeispiel: Eine API-Antwort

Nehmen Sie die beiden Beispielobjekte, mit denen die Seite startet.

Links:

{
  "name": "Alice",
  "age": 30,
  "email": "alice@example.com",
  "address": { "city": "New York", "zip": "10001" }
}

Rechts:

{
  "name": "Alice",
  "age": 31,
  "email": "alice@newdomain.com",
  "address": { "city": "Brooklyn", "zip": "10001" },
  "phone": "+1234567890"
}

Das Tool rekursiert in address und meldet die folgenden, nach Pfad sortierten Einträge:

PfadTypDetail
address.citygeändertNew York → Brooklyn
address.zipunverändert10001
agegeändert30 → 31
emailgeändertalice@example.com → alice@newdomain.com
nameunverändertAlice
phonehinzugefügt+1234567890

Die Zusammenfassung lautet 1 hinzugefügt, 0 entfernt, 3 geändert und 2 unverändert. Beachten Sie, dass address selbst nicht als Änderung auftaucht – nur sein geändertes Kind, was die Ausgabe auf das konzentriert, was sich tatsächlich unterscheidet.

Was gemeldet und was übersprungen wird

SituationGemeldet als
Schlüssel nur rechtshinzugefügt
Schlüssel nur linksentfernt
Gleicher Schlüssel, anderer primitiver Wertgeändert
Gleicher Schlüssel, anderer Typ (Objekt gegen Zeichenkette)geändert, beide Werte sichtbar
Gleicher Schlüssel, tief gleiche Werteunverändert
Array mit anderer Länge oder anderem Elementgeändert (das ganze Array)
Array mit identischen Elementen in gleicher Reihenfolgeunverändert
Schlüssel in anderer Reihenfolgekein Unterschied
Neu eingerückte Eingabekein Unterschied

Die letzten beiden Zeilen sind der Grund, für JSON einen strukturellen Diff statt eines Text-Diffs zu verwenden: Formatierungsrauschen verschwindet.

Warum nicht einfach ein Text-Diff?

Ein zeilenbasierter Text-Diff vergleicht Zeichen und meldet daher eine Änderung, sobald ein Schlüssel wandert oder sich die Einrückung verschiebt. JSON hat keine bedeutungstragende Schlüsselreihenfolge, und Pretty-Printer ändern Leerraum nach Belieben, sodass ein Text-Diff zweier semantisch identischer Dokumente die ganze Datei aufleuchten lässt. Dieses Tool parst zuerst und vergleicht Werte, wodurch dieses Rauschen entfällt. Bei Arrays geht es den umgekehrten Kompromiss ein: Ein Text-Diff kann zeigen, welche Zeilen eingefügt wurden, während dieses Tool das gesamte Array als einen geänderten Wert meldet. Nutzen Sie den JSON-Diff, wenn Struktur zählt, und einen Text-Diff, wenn die exakten Zeichenänderungen zählen.

Wenn Arrays nicht ausreichen

Weil Arrays alles-oder-nichts sind, wird das Einfügen eines Elements am Anfang eines großen Arrays als einzelner geändert-Eintrag mit dem gesamten alten und neuen Array gemeldet. Das Tool sagt Ihnen nicht, dass items[0] eingefügt wurde oder dass sich items[3].id geändert hat. Für kleine Arrays ist das in Ordnung, und es vermeidet mehrdeutige Zuordnungen, wenn Elemente keine stabile Identität haben. Wenn Sie einen Vergleich auf Elementebene brauchen, normalisieren Sie die Daten zuerst – wandeln Sie das Array etwa in ein nach id verschlüsseltes Objekt um – und vergleichen Sie dann die normalisierte Form.

Ausgabe und Zähler lesen

Die vier Zähler enthalten auch unveränderte Blätter und summieren sich daher auf die Gesamtzahl der verglichenen Blätter, nicht auf die Zahl der Unterschiede. Ein Diff ohne Unterschiede zeigt eine kurze Meldung „keine Unterschiede“ und blendet dennoch alle vier Zähler ein. Weil unveränderte Einträge in der Liste stehen, kann ein großes Objekt selbst dann ein langes Ergebnis liefern, wenn sich nur ein Wert bewegt hat; scannen Sie nach den farbigen Markierungen für hinzugefügt, entfernt und geändert, wenn Sie nur an den Bewegungen interessiert sind. Alles wird lokal im Browser verarbeitet, API-Antworten und Konfigurationsdateien werden also nie übertragen.

Verwandte Tools

  • JSON-Formatierer — Rohe JSON-Strings validieren, formatieren und in lesbare, eingerückte Strukturen verschönern.
  • Diff-Checker — Zwei Textblöcke nebeneinander mit hervorgehobenen Unterschieden vergleichen.
  • JSON zu CSV — JSON-Arrays in kommagetrennte Werte für die Tabellenkalkulationsanalyse umwandeln.
  • YAML-zu-JSON-Konverter — Zwischen den Formaten YAML und JSON konvertieren.

Häufig gestellte Fragen

Warum muss die oberste Ebene ein Objekt sein?

Der Diff ist auf benannte Schlüssel und Pfade in Punktnotation wie `address.city` ausgelegt und erwartet daher an der Wurzel jeder Eingabe ein JSON-Objekt. Ein reines Array, eine Zeichenkette, eine Zahl oder `null` auf oberster Ebene wird mit einer eindeutigen Fehlermeldung abgelehnt. Wenn Sie Arrays vergleichen möchten, verpacken Sie sie in ein Objekt mit einem Schlüssel wie `items`.

Wie werden Array-Elemente verglichen?

Arrays werden als ein einziger Blattwert behandelt und mit tiefer Gleichheit verglichen. Unterscheidet sich die Länge oder weicht irgendein Element auf irgendeiner Ebene ab, wird das gesamte Array als geändert gemeldet und alter wie neuer Wert stehen nebeneinander. Einzelne Array-Indizes wie `items[2]` meldet das Tool nie; ein elementweiser Diff ist nicht implementiert.

In welcher Reihenfolge werden die Unterschiede aufgelistet?

Nach dem rekursiven Durchlauf werden die Pfade alphabetisch mit einem lokalisierungsbewussten Zeichenkettenvergleich sortiert. Dadurch ist die Ausgabe deterministisch: gleiche Eingaben erzeugen immer dieselbe Reihenfolge. Das erklärt auch, warum `address.city` vor `age` erscheint – verglichen wird Zeichen für Zeichen und nicht nach Verschachtelungstiefe.

Was zählt zum Zähler der unveränderten Einträge?

Jeder Blattwert, der in beiden Eingaben vorhanden und tief gleich ist, zählt als unverändert, verschachtelte Schlüssel eingeschlossen. Sind beide Seiten Objekte, rekursiert das Tool weiter und der Elternpfad selbst zählt nicht mit – nur die Blätter. Ein hinzugefügter, entfernter oder geänderter Schlüssel wird nicht als unverändert gezählt.

Wie wird `null` gegenüber einem fehlenden Schlüssel behandelt?

Ein Schlüssel, der ausdrücklich `null` ist, ist vorhanden und wird als Wert verglichen; ein fehlender Schlüssel ist `undefined`. Wird ein Feld von `null` auf eine Zeichenkette geändert, gilt es als geändert; wird ein Feld hinzugefügt, das zufällig `null` ist, gilt es als hinzugefügt. Diese Unterscheidung ist wichtig, wenn eine API „kein Wert“ mit `null` signalisiert, statt das Feld wegzulassen.

Beeinflussen Schlüsselreihenfolge oder Leerraum das Ergebnis?

Nein. Beide Eingaben werden mit `JSON.parse` geparst und nach Wert verglichen, daher erzeugen umsortierte Schlüssel oder eine andere Einrückung keine Unterschiede. Gemeldet werden nur echte Änderungen an Wert, Typ und Vorhandensein – genau das macht das Tool für verrauschte Diffs in der Versionsverwaltung nützlich.

Geprüft vom HandyTools-Hub-Team · Zuletzt aktualisiert