Compare JSON
Compare JSON vergleicht nach Wert statt nach Text. Umsortierte Keys sind keine Änderung, umsortierte Array-Einträge auch nicht – eine Zahl, die still zum String wurde, aber schon. Und genau die übersieht jeder andere Vergleich.
Kostenlos · Ohne Anmeldung · Nichts verlässt deinen Browser
Vergleicht zwei JSON-Dokumente nach Wert statt nach Text. Umsortierte Keys sind keine Änderungen, umsortierte Array-Einträge auch nicht – was auf der Seite übrig bleibt, ist der Unterschied, den du gesucht hast, nicht die fünfzig, die die Reihenfolge verursacht hat.
9 Zeilen · 240 Zeichen
9 Zeilen · 242 Zeichen
2 Unterschiede und 3 Verschiebungen
- Geändert
- 1 · 1 mit geändertem Typ
- Hinzugefügt
- 0 · nur im zweiten vorhanden
- Entfernt
- 0 · nur im ersten vorhanden
- Verschoben
- 3 · gleicher Eintrag, neue Position
Typ$.page
1→"1"Gleicher Text, anderer Typ – aus Zahl wurde String. Beide sehen auf dem Bildschirm gleich aus, ein Diff, der angezeigte Werte vergleicht, zeigt hier also nichts.
verschoben$.users[id=42]
{ 3 Keys }→{ 3 Keys }Position 0 → 1. Der Eintrag selbst kann sich auch geändert haben; solche Änderungen stehen separat.
geändert$.users[id=42].role
"admin"→"owner"verschoben$.users[id=17]
{ 3 Keys }→{ 3 Keys }Position 1 → 2. Der Eintrag selbst kann sich auch geändert haben; solche Änderungen stehen separat.
verschoben$.users[id=88]
{ 3 Keys }→{ 3 Keys }Position 2 → 0. Der Eintrag selbst kann sich auch geändert haben; solche Änderungen stehen separat.
Alles läuft in deinem Browser – keins der beiden Dokumente wird hochgeladen, geloggt oder gespeichert. Zwei API-Antworten zu vergleichen heißt meist, zwei Sätze echter Kundendaten zu vergleichen – ein guter Grund, sie nicht an den Server von jemand anderem zu schicken.
Tekk lässt Loops über deine Codebase laufen, die finden, was sich verbessern lässt, und deinem Coding-Agent die Spec übergeben, sobald du es mit Greenlight freigibst – um den Unterschied zwischen dem zu finden, was in der Spec stand, und dem, was gebaut wurde.
So funktioniert’s
- 1
Füg beide Dokumente ein
Verglichen wird beim Tippen. Leerzeichen, Einrückung und Reihenfolge der Keys werden ignoriert, weil nichts davon zum Wert gehört – ein Objekt mit anders sortierten Keys ist dasselbe Objekt, und ein JSON-Diff, der etwas anderes sagt, berichtet über die Formatierung.
- 2
Lass das Array-Matching auf Identität
Hat jeder Eintrag eine id, uuid, E-Mail oder einen Slug, werden die Einträge darüber zugeordnet statt über den Index. Zwei API-Antworten mit denselben Datensätzen in anderer Reihenfolge ergeben dann Verschiebungen statt einer Änderung an jedem Feld – das ist der Unterschied zwischen einem lesbaren und einem unlesbaren Ergebnis.
- 3
Lies die Pfade
Jeder Unterschied wird als Pfad gemeldet, mit dem du etwas anfangen kannst – $.users[id=42].role statt „Zeile 14“. Kopier alles als Text für ein Ticket, oder stell das Matching zurück auf Position, wenn genau die Reihenfolge der Indizes das ist, was du prüfen willst.
Neun Unterschiede – oder einer
Zwei Versionen derselben API-Antwort. Die Datensätze kamen in anderer Reihenfolge zurück, eine Rolle hat sich geändert, und page kam diesmal als String an.
Zugeordnet nach Position, so wie es die meisten Vergleichs-Tools machen:
~ $.page 1 → "1"
~ $.users[0].id 42 → 88
~ $.users[0].email "ada@example.com" → "alan@example.com"
~ $.users[0].role "admin" → "viewer"
~ $.users[1].id 17 → 42
~ $.users[1].email "grace@example.com" → "ada@example.com"
~ $.users[1].role "editor" → "owner"
~ $.users[2].id 88 → 17
~ $.users[2].email "alan@example.com" → "grace@example.com"
~ $.users[2].role "viewer" → "editor"
Zehn Zeilen, neun davon Rauschen, und die echte Änderung steckt mittendrin.
Zugeordnet nach Identität:
~ $.page 1 → "1" (number became string)
↔ $.users[id=42] position 0 → 1
~ $.users[id=42].role "admin" → "owner"
↔ $.users[id=17] position 1 → 2
↔ $.users[id=88] position 2 → 0
Dieselben zwei Dokumente. Eine Änderung, eine Typänderung, drei Verschiebungen.
Was als Unterschied zählt
Kein Unterschied:
- Reihenfolge der Keys. JSON-Objekte sind ungeordnet – RFC 8259 §4 sagt das direkt.
{"a":1,"b":2}und{"b":2,"a":1}sind dasselbe Objekt, und jedes Tool, das es markiert, vergleicht die Datei statt der Daten. - Leerzeichen und Einrückung. Kein Teil des Werts.
- Wie eine Zahl geschrieben wurde.
1,1.0und1e0sind eine Zahl. - Reihenfolge im Array, wenn sich Einträge über ihre Identität zuordnen lassen – gemeldet als Verschiebung, nicht als Neufassung.
Ein Unterschied, auch die, die man leicht übersieht:
- Eine Typänderung ohne sichtbare Änderung.
42→"42"sieht aus, als wäre nichts passiert. Es bricht jeden Client, der===macht, und genau das tun ein ORM-Upgrade oder ein neues API-Gateway mit deinen Integer-IDs, ohne es zu erwähnen. nullgegenüber fehlend. Ein vorhandener Key mit null ist nicht dasselbe wie ein Key, der weg ist. Die meisten Konsumenten behandeln das unterschiedlich, die meisten Diffs nicht.falsegegenüber0gegenüber"". Alle falsy, keiner gleich.- Zwei große Integer, die ein Double nicht unterscheiden kann.
12345678901234567890und...891sind nachJSON.parsederselbe Wert. Hier, so verglichen wie geschrieben, sind sie es nicht.
Warum Identitäts-Matching überall sonst standardmäßig aus ist
Weil es eine Entscheidung braucht, und die meisten Tools treffen lieber keine. Auf einem Key matchen heißt, den Key auszuwählen.
Dieses hier wählt aus id, _id, uuid, key, slug, sku, email, name – in dieser Reihenfolge – und nutzt einen davon nur, wenn jeder Eintrag auf beiden Seiten ihn hat und die Werte auf beiden Seiten eindeutig sind. Eine wiederholte id würde das Matching willkürlich machen, also lässt es das und sagt, warum.
Gibt es keinen solchen Key, enthalten die beiden Arrays aber genau dieselben Werte in anderer Reihenfolge, ist das trotzdem eine Umsortierung und wird als solche gemeldet. Erst wenn beides nicht zutrifft, fällt es auf den Vergleich per Index zurück und sagt dir, dass es das getan hat – denn ein positionsbasierter Vergleich eines umsortierten Arrays ist genau das Ergebnis, das Leute nach einem Bug suchen lässt, den es nicht gibt.
Wo die Ansicht nebeneinander verliert
Zwei Fenster nebeneinander sind die richtige Form, wenn du eine Änderung reviewst, die du selbst gemacht hast. Sie sind die falsche Form, wenn du einen Unterschied suchst, den du nicht gemacht hast, denn dann besteht die Arbeit darin, in zwei Fenstern nach Farbe zu scrollen.
Sechs Pfade sind die Antwort. $.users[id=42].role kannst du in deinem Editor suchen, in ein Ticket einfügen oder an wen auch immer weitergeben, dem dieser Endpoint gehört.
Häufige Fragen
- Speichert ihr meine Daten oder schickt sie irgendwohin?
- Nein. Der Vergleich besteht aus ein paar Kilobyte JavaScript, die auf deinem Rechner laufen – kein Server-Aufruf, kein Logging, kein Konto. Zwei API-Antworten zu vergleichen heißt meist, zwei Sätze echter Kundendatensätze zu vergleichen, und das ist ein guter Grund, sie nicht dem Server von jemand anderem zu geben.
- Warum heißt es, zwei Dokumente stimmen überein, obwohl der Text anders ist?
- Weil sie derselbe Wert sind. JSON-Objekte sind per Definition ungeordnet – RFC 8259 sagt das ausdrücklich –, also tragen {"a":1,"b":2} und {"b":2,"a":1} identische Information. Leerzeichen gehören ebenfalls nicht zum Wert, und auch nicht, ob jemand 1, 1.0 oder 1e0 geschrieben hat. Ein Text-Diff zeigt alle drei als Änderung. Keine davon ist eine.
- Meine zwei API-Antworten haben dieselben Datensätze, aber jedes Feld wird als geändert angezeigt.
- Das ist positionsbasiertes Matching, und so arbeiten die meisten Tools. Kamen die zehn Datensätze in anderer Reihenfolge zurück, wird Eintrag 0 mit einem ganz anderen Datensatz verglichen, also unterscheidet sich jedes Feld darin. Stell das Array-Matching auf Identität, und dieselben Daten ergeben eine Handvoll Verschiebungen plus das, was sich wirklich geändert hat. Das ist die größte einzelne Quelle für Rauschen, wenn du JSON vergleichen willst.
- Wie entscheidet das Identitäts-Matching, was einen Eintrag identifiziert?
- Es sucht nach id, _id, uuid, key, slug, sku, email oder name – in dieser Reihenfolge – und nutzt einen davon nur, wenn jeder Eintrag auf beiden Seiten ihn hat und die Werte eindeutig sind. Auf einem Key zu matchen, der sich wiederholt, wäre eine Vermutung, die als Ergebnis daherkommt, also lässt es das. Gibt es keinen solchen Key, enthalten die beiden Arrays aber genau dieselben Werte in anderer Reihenfolge, meldet es die Umsortierung; andernfalls fällt es auf Position zurück und sagt dir, dass es das getan hat.
- Erkennt es einen Wert, der seinen Typ geändert hat?
- Ja, und dafür lohnt sich die Seite. 42 und "42" sehen gleich aus, also zeigt alles, was angezeigte Werte vergleicht, gar nichts. Es ist auch ein extrem häufiger Bug – eine geänderte Serialisierung, ein ORM-Upgrade oder ein neues Gateway, das jede Integer-ID zum String macht, bricht Clients, die strikt auf Gleichheit prüfen, und in der Antwort sieht nichts anders aus.
- Kommt es mit großen Zahlen richtig klar?
- Ja, und die meisten Vergleiche nicht. Ein Tool auf Basis von JSON.parse schickt jede Zahl durch einen Double, also runden zwei verschiedene 19-stellige IDs auf denselben Wert und gelten als gleich. Dieses hier vergleicht die Ziffern so, wie sie geschrieben sind. Außerdem markiert es jede Zahl in beiden Dokumenten, die sich ändert, sobald etwas sie parst.
- Was passiert, wenn eine Seite einen doppelten Key hat?
- Verglichen wird so, wie ein Parser es sieht – der letzte gewinnt –, und du erfährst, dass die Wiederholung da ist. Das zählt, weil der frühere Wert für den Vergleich und für jeden Konsumenten des Dokuments unsichtbar ist, und genau deshalb überlebt ein doppelter Key so lange unbemerkt.
- Kann ich JSON vergleichen, das sich nicht ganz parsen lässt?
- Oft ja. Kommentare, Kommas am Ende, einfache Anführungszeichen, Keys ohne Anführungszeichen und Pythons True, False und None werden vor dem Vergleich repariert, du kannst also eine tsconfig.json oder ein ausgegebenes Python-Dict mit echtem JSON vergleichen. Ist ein Dokument wirklich kaputt, bekommst du Zeile und Spalte des ersten Problems statt einer pauschalen Ablehnung.
- Wie unterscheidet sich Compare JSON von einem Text-Diff?
- Ein Text-Diff vergleicht Zeilen, also meldet er jede umformatierte Zeile, jeden umsortierten Key und jeden verschobenen Array-Eintrag. Ein JSON-Diff parst zuerst beide Seiten und vergleicht die Werte – deshalb kann er sagen, dass zwei unterschiedlich geschriebene Dokumente identisch sind, und deshalb erkennt er eine Typänderung, die nach nichts aussieht. Und deshalb kostet dich JSON online vergleichen hier nichts: Das Parsen passiert in deinem Browser, kein Server macht die Arbeit.
- Gibt es einen JSON-Vergleich online, der meine Daten nicht hochlädt?
- Ja: Compare JSON. Jedes Online-Tool zum JSON-Vergleich, das dir ein Ergebnis zeigt, muss die Dokumente irgendwo parsen, und die meisten tun das auf einem Server – deine zwei API-Antworten sind also bei Dritten gelandet, bevor du die Antwort siehst. Hier ist der Parser Teil der Seite, es wird nichts übertragen, und das Tool funktioniert auch ohne Netzwerkverbindung.
- Gibt es eine Ansicht nebeneinander?
- Nein – es zeigt eine Liste von Pfaden. Bei zwei großen Dokumenten heißt eine Ansicht nebeneinander, in zwei Fenstern nach farbigen Zeilen zu suchen, während eine Liste mit sechs Pfaden schon die Antwort ist. Jeder Eintrag ist ein JSONPath, nach dem du in deinem Editor suchen oder den du in ein Ticket einfügen kannst.
- Was ist der Unterschied zwischen geändert und verschoben?
- Geändert heißt, der Wert unter diesem Pfad ist anders. Verschoben heißt, derselbe Eintrag steht in beiden Dokumenten an einem anderen Index – das taucht nur auf, wenn das Array-Matching auf Identität steht. Ein Eintrag kann beides sein und steht dann zweimal in der Liste: einmal für die Verschiebung und einmal für das, was sich darin geändert hat.
- Gibt es eine Größenbegrenzung?
- Keine harte Grenze, aber beide Dokumente werden bei jedem Tastendruck neu geparst und verglichen, Eingaben mit mehreren Megabyte fühlen sich im Textfeld also zäh an. Ab etwa sechzig Unterschieden wird die Liste auf dem Bildschirm gekürzt; kopierst du die Unterschiede, bekommst du trotzdem alle.
- Kann ich zwei JSON-Dateien vergleichen, statt sie einzufügen?
- Öffne sie und füg sie ein. Einen Upload gibt es bewusst nicht – sobald eine Seite eine Datei annimmt, hat sie einen Grund, sie irgendwohin zu schicken, und der ganze Sinn hier ist, dass nichts verschickt wird.
- Warum ist das kostenlos, und was ist Tekk?
- Tekk macht dein Produkt zu einem, das sich selbst verbessert: 16 Loops beobachten deine Codebase und bringen dir Proposals, die du mit Greenlight freigibst oder ablehnst, und dein Coding-Agent baut das Ergebnis. Diese Seite kostet im Betrieb nichts, weil nichts auf unseren Servern läuft – deshalb gibt es keine Anmeldehürde, kein Limit und keinen Upsell im Tool.
Willst du eine echte Spec für das, was du baust?
Schreib einen Satz. Tekk liest deinen Code und schreibt die Spec, die dein Coding-Agent baut – und seine Loops behalten im Blick, was du auslieferst.
Kostenlos testen · GitHub bei der Registrierung verbinden