Kaputtes JSON reparieren

Füge das JSON ein, das sich nicht öffnen lässt: eine Chat-Antwort mit dem Codeblock drumherum, eine Konfigurationsdatei mit Kommentaren, eine Python-Ausgabe mit True und None, ein Log mit einem Objekt pro Zeile. Heraus kommt gültiges JSON, mit der Liste aller Korrekturen, jeweils mit der Stelle, an der sie vorgenommen wurde. Wurde der Text abgeschnitten, schließt die Seite ihn und sagt es dir klar und deutlich. Nichts verlässt deinen Browser.

Der Text verlässt nie deinen Browser: Die Reparatur passiert hier auf deinem Gerät, nichts wird an einen Server gesendet oder irgendwo gespeichert.

Woher kaputtes JSON kommt

Fast nie von einem Programm: Programme schreiben korrektes JSON. Es kommt aus einer Chat-Antwort, die es in einen Codeblock mit einem Satz davor und einem danach packt und ab und zu einen Kommentar ergänzt, um dir ein Feld zu erklären. Es kommt aus einer von Hand geschriebenen Konfigurationsdatei, in der das Komma nach dem letzten Eintrag und die Kommentare normal sind, weil der Editor sie akzeptiert. Es kommt aus einem print-Aufruf in Python, der einfache Anführungszeichen und True, False und None schreibt. Und es kommt aus einem Log, in dem jede Zeile ein eigenes Objekt ist, oft mit der Uhrzeit oder dem Namen des Dienstes davor, und die ganze Datei ist nicht ein JSON, sondern viele hintereinander.

In all diesen Fällen bleibt das Programm, das es lesen soll, beim ersten Fehler stehen und meldet etwas wie „Unexpected token“. Einen Fehler von Hand zu beheben geht noch; vierzig, verteilt auf zweitausend Zeilen, mit einem neuen Durchlauf nach jedem einzelnen, nicht mehr. Hier fügst du alles auf einmal ein, auch mit dem Satz aus dem Chat drumherum.

Jede Korrektur wird aufgelistet, mit Zeile und Spalte

Ein Reparatur-Tool, das gültiges JSON zurückgibt, ohne zu sagen, was es angefasst hat, ist eine Blackbox: Die Datei öffnet sich jetzt, aber du weißt nicht, ob die Daten, die darin waren, noch da sind. Hier hat jede Änderung eine Zeile in der Liste, mit der genauen Stelle im eingefügten Text: Zeile 14, Spalte 3, überzähliges Komma am Ende entfernt.

Die Korrekturen sind nicht alle gleich, und die Liste zeigt das auch. Einen Kommentar, ein überzähliges Komma oder den Markdown-Block zu entfernen, ändert keine Daten. Andere sind Entscheidungen, und sie sind als solche markiert: NaN und Infinity werden zu null, weil JSON sie nicht darstellen kann, und JSON.stringify macht es genauso; eine als 007 geschriebene Zahl wird zu 7, und wenn es eine Postleitzahl war, waren diese Nullen Daten; mehrere Objekte hintereinander werden zu einer Liste, weil eine JSON-Datei nur einen einzigen Wert enthält.

Der gefährliche Fall: mittendrin abgeschnittenes JSON

Bei Chats passiert das ständig: Die Antwort ist lang, das Modell erreicht sein Limit und hört mitten in einer Liste auf, oft mitten in einem Wort. Der Text, den du hast, ist nicht falsch, er ist unvollständig, und das sind zwei verschiedene Probleme. Die fehlenden schließenden Zeichen wieder anzufügen macht ihn gültig, und das passiert hier; aber so geschlossenes JSON enthält weniger Daten als das Original, und ein Programm, das es liest, kann das nicht bemerken.

Deshalb sagt die Seite in diesem Fall nicht einfach „gültig“. Sie meldet den Text als abgeschnitten, nennt die Stelle (Zeile und Spalte), an der er aufhört, und sagt, worin er endet (in einem Text, einer Zahl, einer noch offenen Liste), welche schließenden Zeichen sie angefügt und welches Stück sie entfernt hat. Und die Regel ist streng: Zum Schließen angefügt werden nur Anführungszeichen und Klammern. Was halb fertig geblieben ist und sich nicht schließen lässt, ohne etwas zu erfinden, wird entfernt: ein mittendrin abgeschnittener Schlüsselname, denn ein gekürzter Schlüssel ist ein anderer Schlüssel; ein „tru“, das nur true sein könnte; ein hängengebliebenes Komma.

Ein Beispiel mit Zahlen: Eine Liste von 50 Produkten, die im Namen des achtunddreißigsten abbricht, kommt als Liste mit 38 Einträgen heraus, der letzte mit abgeschnittenem Namen, und die Seite markiert ihn als abgeschnittenen Wert. Die anderen zwölf sind nicht da, und niemand kann sie wiederherstellen: Du musst den Chat bitten, weiterzumachen oder in mehreren Teilen zu antworten. Die Datei, die du in diesem Fall herunterlädst, trägt das Wort „unvollständig“ im Namen, damit du sie nicht mit einer guten verwechselst.

Anführungszeichen: gerade, typografische und einfache

Die typografischen Anführungszeichen gelangen ins JSON, wenn es durch Word, eine E-Mail oder eine Handytastatur läuft, die sie beim Tippen „verschönern“. Wo sie als Begrenzer dienen, werden sie gerade. Innerhalb eines Textes sind sie dagegen Inhalt und bleiben, wie sie sind: Ein Satz mit typografischen Anführungszeichen darf nicht anders herauskommen, als er hineingegangen ist. Dasselbe gilt für // und # in einer Webadresse, die keine Kommentare sind, und für das Wort True in einem Satz.

Die einfachen Anführungszeichen sind die von Python und JavaScript. Hier wird auch der Apostroph im Text erkannt, etwa in geht's: Ein einfaches Anführungszeichen schließt den String nur, wenn das Folgende auf einen Wert folgen kann, also ein Komma, ein Doppelpunkt, eine Klammer oder das Zeilenende. Die geraden Anführungszeichen innerhalb eines Textes ohne den schützenden Backslash werden dagegen nicht erraten: Dort hält die Seite an und sagt, wo.

Die Backslashes folgen derselben Idee. Enthält ein Text auch nur einen, den JSON nicht kennt, wie in C:\Users\anna\new, wurde dieser Text von einem Menschen geschrieben, und alle seine Backslashes bleiben echte Backslashes: auch der vor new, den JSON als Zeilenumbruch lesen würde.

Was gleich bleibt und wie das geprüft wird

JSON, das schon gültig ist, kommt mit demselben Wert heraus, nur formatiert. Das klingt selbstverständlich und ist es nicht: Viele Tools gehen über JSON.parse, das eine Kennung wie 12345678901234567890 in 12345678901234567000 verwandelt, und eine gerundete Kennung ist eine andere Kennung. Hier bleiben Zahlen genau so geschrieben, wie sie waren, auch 1.50. Auch die Reihenfolge der Schlüssel bleibt, und doppelte Schlüssel bleiben beide erhalten und werden markiert: Fast jedes Programm behält nur den letzten, und welchen du wegwirfst, entscheidest du.

Der Test für dieses Tool ist keine Handvoll von Hand ausgesuchter Beispiele. Ein Programm erzeugt Hunderte gültiger JSON-Dokumente, beschädigt sie auf bekannte Weise, notiert dabei, wo es jeden Fehler eingebaut hat, und verlangt, dass der reparierte Wert genau der Ausgangswert ist, zurückgelesen mit der Standardbibliothek von Python, und dass die Liste genau diese Fehler an genau diesen Stellen nennt. Bei abgeschnittenen Texten verlangt es das längste Stück, das sich behalten lässt: nichts Vollständiges weggeworfen, und genau die fehlenden schließenden Zeichen, keines mehr.

Was es nicht tut

Es rät nicht. Ein Wort ohne Anführungszeichen, wo ein Wert stehen muss, wie status: active; ein Datum oder eine Version ohne Anführungszeichen, wie 2024-01-15 oder 3.5.1, die keine Zahlen sind; eine mit der falschen Klammer geschlossene Klammer oder eine zu viel mit weiteren Daten danach; zwei Kommas hintereinander. In diesen Fällen gibt es mehr als eine mögliche Reparatur, und zufällig eine auszuwählen hieße, dir erfundene Daten unterzujubeln, die echt aussehen. Die Seite hält an, nennt Zeile und Spalte und zeigt dir die Stelle mit einem Pfeil. Und sie wirft keine Daten stillschweigend weg: Was sie vor und nach dem JSON entfernt, ist nur der Satz aus dem Chat.

Es prüft nicht, ob die Daten stimmen. Repariertes JSON ist JSON, das sich lesen lässt, nicht JSON, das die Wahrheit sagt: Hat der Chat einen Preis falsch angegeben, bleibt der Preis falsch. Und es kennt das Schema nicht, das dein Programm erwartet.

Es erledigt keine anderen Aufgaben. Zum Einrücken, Komprimieren oder Sortieren der Schlüssel von bereits gültigem JSON gibt es das Tool JSON formatieren & validieren. Um es in eine Tabelle für Excel umzuwandeln, gibt es JSON in CSV. Ist die Datei YAML, das Format mit Einrückung und ohne Klammern, gibt es YAML in JSON. Und wenn du aus derselben Chat-Antwort auch die anderen Codeblöcke brauchst, gibt es das Tool Code aus KI-Antwort holen.

Ähnliche Tools