JSON Diff

Zwei JSON-Dokumente semantisch vergleichen – ohne dass Whitespace oder Objekt-Key-Reihenfolge stören.

Semantisch statt rein textuell

Ein Text-Diff meldet schon andere Einrückung oder eine geänderte Reihenfolge von Objekt-Schlüsseln. Minimenta vergleicht dagegen die JSON-Struktur. {"a":1,"b":2} und {"b":2,"a":1} gelten deshalb als gleich. Typen bleiben strikt verschieden: 42 und "42" sind nicht dasselbe.

Auch Zahlen werden nach ihrem JSON-Zahlenwert verglichen, ohne sie vorher in JavaScript-Number umzuwandeln. Schreibweisen wie 1, 1.0 und 1e0 sind damit gleichwertig, während Unterschiede in sehr großen oder hochpräzisen Zahlen erhalten bleiben.

Wofür ist ein struktureller JSON-Vergleich hilfreich?

Typische Fälle sind zwei API-Antworten, Konfigurationsstände, Exporte oder Test-Fixtures. Wenn sich nur die Formatierung geändert hat, bleibt der Vergleich ruhig. Wenn dagegen ein Feld fehlt, neu hinzugekommen ist, seinen Typ gewechselt hat oder an einer anderen Stelle im Array steht, wird genau diese strukturelle Änderung sichtbar.

Welche Array-Option passt?

Standardmäßig behandelt Minimenta Arrays als geordnet. Eine einzelne Einfügung wird so ausgerichtet, dass nicht automatisch alle nachfolgenden Werte als geändert erscheinen. „Array-Reihenfolge ignorieren“ solltest du nur aktivieren, wenn die Reihenfolge fachlich wirklich keine Bedeutung hat – etwa bei einer mengenartigen Liste.

Bei Arrays aus Objekten kannst du zusätzlich einen eindeutigen primitiven Schlüssel wie id angeben. Dann lassen sich dieselben Objekte trotz Positionswechsel wiedererkennen und verschobene sowie intern geänderte Einträge getrennt anzeigen. Fehlt der Schlüssel bei einem Eintrag oder ist er nicht eindeutig, meldet Minimenta das und fällt für dieses Array auf den Standardvergleich zurück.

Volatile Felder gezielt ignorieren

Zeitstempel, Request-IDs oder andere bewusst wechselnde Teilbäume können über einen exakten JSON Pointer ausgeblendet werden, zum Beispiel /metadata/requestId. Die Ignorierung gilt für genau diesen Pfad und seinen Teilbaum – Wildcards wie /items/* werden nicht als Muster interpretiert.

JSON Pointer nach RFC 6901 beginnt mit /. Enthält ein Schlüssel selbst / oder ~, werden diese Zeichen als ~1 beziehungsweise ~0 geschrieben. Minimenta prüft diese Escape-Regeln bereits beim Hinzufügen eines Ignore-Pfads.

Warum blockieren doppelte Objekt-Schlüssel den Diff?

Ein JSON-Objekt mit demselben Schlüssel mehrfach ist für einen semantischen Vergleich mehrdeutig: Verschiedene Empfänger können solche Dokumente unterschiedlich auswerten. Minimenta zeigt deshalb die Fundstellen an und startet keinen strukturellen Diff, bis die Duplikate behoben sind. Ungültiges JSON kann separat über einen Reparaturvorschlag korrigiert werden; übernommen wird eine Reparatur erst nach deiner Bestätigung.

JSON Pointer und JSON Patch

Jede Änderung erhält einen RFC-6901-Pfad, den du einzeln oder gesammelt kopieren kannst. Zusätzlich erzeugt Minimenta aus einem eindeutigen Vergleich einen JSON Patch nach RFC 6902. Der Patch besteht aus Operationen wie add, remove und replace und kann kopiert oder als Datei gespeichert werden.

Bei Arrays erzeugt Minimenta bewusst einen konservativen replace für das betroffene Array, statt eine Folge positionsabhängiger Einzeloperationen zu konstruieren. Dadurch können Indexverschiebungen beim nacheinander Anwenden des Patches den Zielzustand nicht verfälschen.

Beide JSONs bleiben auf deinem Gerät

Validierung, Repair und Diff laufen lokal im Browser; aufwendigere Schritte werden in einem Web Worker ausgeführt. Du kannst JSON-Dateien direkt öffnen, aber ihre Inhalte werden weder in die URL noch in LocalStorage oder an einen Minimenta-Server geschrieben.

Wenn eine Seite noch ungültig ist, du Schlüssel sortieren oder das Dokument unabhängig vom Vergleich als Baum ansehen möchtest, ist der Formatter der passende vorgelagerte Schritt.