mygems

JSON reparieren: Alle häufigen Fehler erklärt

Unexpected token, abschließendes Komma, einfache Anführungszeichen, unerlaubte Kommentare: was jeder JSON-Fehler bedeutet und wie du ihn behebst.

Von mygems ·

JSON ist streng, und zwar auf eine Art, die kleinlich wirkt, bis man die Regeln kennt. Keine abschließenden Kommas. Nur doppelte Anführungszeichen. Keine Kommentare. Schlüssel müssen in Anführungszeichen stehen. Verstößt man irgendwo gegen eine dieser Regeln, wird das ganze Dokument abgelehnt, mit einer Meldung, die auf eine Zeichenposition zeigt und selten sagt, was falsch ist.

Diese Seite ordnet die Fehlermeldungen ihren Ursachen zu und die Ursachen den passenden Lösungen.

Die schnelle Antwort

  1. Position finden. Jeder Parser meldet Zeile und Spalte oder einen Zeichen-Offset. Geh dorthin; der Fehler liegt an dieser Stelle oder kurz davor.
  2. Auf die üblichen fünf achten: ein abschließendes Komma, einfache Anführungszeichen, ein Schlüssel ohne Anführungszeichen, ein Kommentar oder ein fehlendes Komma zwischen zwei Einträgen.
  3. Wenn der Fehler bei Position 0 oder in Zeile 1, Spalte 1 liegt, liegt das Problem nicht im JSON. Du hast etwas anderes erhalten: eine HTML-Fehlerseite, eine leere Antwort oder eine Byte-Order-Mark (BOM).

So bekommst du auf jedem Rechner eine genaue Fehlerposition:

python3 -m json.tool broken.json
jq . broken.json

Die Fehlermeldung lesen

Derselbe Fehler sieht in jeder Sprache anders aus. Suche deine Meldung, dann die Ursache:

Meldung (gekürzt)Wo sie auftrittÜbliche Ursache
Unexpected token '<', "<!DOCTYPE"... is not valid JSONJavaScriptDu hast eine HTML-Seite statt JSON erhalten. Siehe unten
Unexpected end of JSON inputJavaScriptLeere Antwort oder abgeschnittene Datei
Expected double-quoted property nameJavaScriptAbschließendes Komma vor } oder ein Schlüssel ohne oder mit einfachen Anführungszeichen
Unexpected non-whitespace character after JSONJavaScriptZwei Dokumente direkt hintereinander oder Zeichen nach der schließenden Klammer
Bad control character in string literalJavaScriptEin echter Tabulator oder Zeilenumbruch in einem String
Expecting value: line 1 column 1 (char 0)PythonLeere Eingabe oder gar kein JSON
Expecting property name enclosed in double quotesPythonAbschließendes Komma, einfache Anführungszeichen oder Schlüssel ohne Anführungszeichen
Expecting ',' delimiterPythonEin fehlendes Komma zwischen zwei Einträgen oder Membern
Extra dataPythonMehr als ein Dokument in der Datei (oft NDJSON)
Invalid control characterPythonEin echter Tabulator oder Zeilenumbruch in einem String
Unexpected UTF-8 BOMPythonUnsichtbare Byte-Order-Mark am Dateianfang

Die Ursachen im Einzelnen

Abschließendes Komma

{ "name": "Ada", "role": "admin", }

In JavaScript-Code erlaubt, in JSON verboten. Der Parser erreicht }, obwohl er einen weiteren Schlüssel erwartet. Lösche das letzte Komma. Typische Quellen sind von Hand bearbeitete Konfigurationsdateien und Code, der JSON per String-Verkettung zusammensetzt.

Einfache Anführungszeichen

{ 'name': 'Ada' }

JSON-Strings verwenden immer doppelte Anführungszeichen. Meist kommt das von einem Python-dict, das mit print() statt mit json.dumps() ausgegeben wurde. Die eigentliche Lösung liegt im Code, der es erzeugt hat: Serialisiere mit einer JSON-Bibliothek, nicht mit String-Formatierung.

Schlüssel ohne Anführungszeichen

{ name: "Ada" }

Gültiges JavaScript, ungültiges JSON. Setze jeden Schlüssel in Anführungszeichen.

Kommentare

{ "port": 8080 // default }

JSON kennt keine Kommentare. Aber Vorsicht, bevor du das „reparieren“: Manche Dateien sollen welche enthalten. tsconfig.json, die settings.json von VS Code und viele andere Konfigurationsdateien sind JSONC (JSON mit Kommentaren) oder JSON5, und die Tools, die sie lesen, akzeptieren Kommentare. Ist deine Datei eine davon, liegt das Problem beim strengen Parser, dem du sie übergibst, nicht bei der Datei.

Ein fehlendes Komma

{ "a": 1 "b": 2 }

Der Parser meldet den Fehler bei "b", also nach der eigentlichen Stelle. Wenn ein Fehler auf einen völlig korrekten Schlüssel zeigt, schau an das Ende der Zeile davor.

Werte, die JSON nicht kennt

NaN, Infinity, undefined und Zahlen mit führenden Nullen wie 007 sind alle ungültig. Ebenso eine Hexadezimalzahl wie 0xFF. Nimm null, einen String oder eine normale Dezimalzahl, je nachdem, was der Empfänger erwartet.

Echte Zeilenumbrüche und Tabulatoren in einem String

Ein String muss Zeilenumbrüche als \n und Tabulatoren als \t maskieren. Ein echter Zeilenumbruch zwischen den Anführungszeichen ist ungültig. Das passiert oft, wenn ein mehrzeiliger Wert von Hand in eine JSON-Datei eingefügt wird.

Backslashes

Ein Windows-Pfad wie "C:\new\folder" bricht, weil \n und \f Escape-Sequenzen sind. Verdopple jeden Backslash, "C:\\new\\folder", oder verwende Schrägstriche.

Typografische Anführungszeichen

“name” sieht aus wie ein String, ist aber keiner: Das sind typografische Anführungszeichen, nicht ". Sie stammen aus kopiertem JSON aus einem Dokument, einer Chat-App oder einer Folie, oder vom Tippen auf iPhone oder iPad, wo die intelligente Zeichensetzung gerade Anführungszeichen beim Tippen ersetzt. Schalte sie unter Einstellungen → Allgemein → Tastatur aus, bevor du unter iOS JSON bearbeitest.

Fehler bei „Position 0“: Es ist kein JSON

Liegt der Fehler beim allerersten Zeichen, ist der Inhalt falsch, nicht die Syntax.

  • < bei Position 0 bedeutet, dass du HTML geparst hast. Der Server hat eine Fehlerseite, eine Login-Seite oder eine 404 geliefert, und dein Code hat versucht, sie als JSON zu lesen. Protokolliere vor dem Parsen die rohe Antwort und den Statuscode.
  • Leere Eingabe bedeutet, dass die Antwort keinen Body hatte, oft bei einem 204 No Content oder einer Anfrage, die scheiterte, bevor der Server antwortete.
  • Ein unsichtbares Zeichen am Anfang ist meist eine UTF-8-Byte-Order-Mark, die ein Windows-Editor hinzugefügt hat. In Python öffnest du die Datei mit encoding="utf-8-sig"; anderswo speicherst du sie als UTF-8 ohne BOM neu.

NDJSON ist kein kaputtes JSON

Eine Datei mit einem JSON-Objekt pro Zeile (.jsonl, .ndjson oder Log-Ausgabe) scheitert mit „Extra data“ oder „Unexpected non-whitespace“ am Anfang von Zeile zwei. Jede Zeile ist für sich gültig. Parse zeilenweise oder nimm ein Tool, das das Format versteht: jq -c . file.jsonl liest jede Zeile.

Automatisch reparieren

Bei den häufigen Patzern (abschließende Kommas, einfache Anführungszeichen, Schlüssel ohne Anführungszeichen, Kommentare) ist automatische Reparatur sicher, weil es nur eine sinnvolle Bedeutung gibt. Diese Tools erledigen das:

  • jsonrepair, eine JavaScript-Bibliothek und ein Kommandozeilen-Tool.
  • Die meisten Code-Editoren, über eine JSON5- oder „Fix JSON“-Erweiterung.
  • Eine JSON-Editor-App, die schon beim Tippen prüft.

Automatische Reparatur ist bei einer abgeschnittenen Datei nicht sicher. Ein Reparatur-Tool schließt die offenen Klammern und liefert ein gültiges Dokument, dem Daten fehlen. Rufe sie stattdessen erneut ab oder exportiere sie neu.

Auf iPhone und iPad zeigt Smart Json den Fehler in verständlichen Worten mit Zeile und Spalte an. Go setzt den Cursor dorthin, und Fix repariert Kommentare, abschließende Kommas, einfache Anführungszeichen und Schlüssel ohne Anführungszeichen mit einem Tipp.

Ein minifiziertes JSON-Dokument im Editor mit einem Banner: Expected a quoted key but found a stray character, Zeile 1, Spalte 2, mit den Schaltflächen Go und Fix
Der Fehler, seine Position und eine Lösung
JSON Editor: Smart JsoniPhone & iPad

Benennt einen JSON-Fehler in klaren Worten mit Zeile und Spalte, springt dorthin und repariert Kommentare, abschließende Kommas, einfache Anführungszeichen und Schlüssel ohne Anführungszeichen mit einem Tipp.

Was es kann

Damit es gar nicht erst kaputtgeht

Fast jede ungültige JSON-Datei wurde von Hand geschrieben oder per String-Verkettung zusammengesetzt. Erzeuge JSON mit einem Serialisierer (json.dumps, JSON.stringify, JSONEncoder) und prüfe von Hand bearbeitete Dateien, bevor du sie committest. Ein Pre-Commit-Hook mit jq . file.json > /dev/null fängt alles oben Genannte ab, bevor es jemand anderes sieht.

Fragen

Was bedeutet „Unexpected token < in JSON at position 0“?
Du hast HTML statt JSON geparst. Der Server hat eine Fehlerseite, eine Login-Seite oder eine 404 geliefert, und dein Code hat versucht, sie als JSON zu lesen. Protokolliere die rohe Antwort und ihren Statuscode, bevor du den Parser aufrufst.
Sind abschließende Kommas in JSON erlaubt?
Nein. Ein Komma nach dem letzten Eintrag eines Objekts oder Arrays macht das Dokument ungültig, auch wenn JavaScript-Code es erlaubt. Entferne das letzte Komma. Die Formate JSON5 und JSONC erlauben es, Standard-JSON-Parser nicht.
Kann JSON Kommentare enthalten?
Standard-JSON nicht. Manche darauf aufbauenden Konfigurationsformate wie JSONC (von VS Code und tsconfig.json verwendet) und JSON5 erlauben Kommentare, und die Tools, die diese Dateien lesen, akzeptieren sie. Ein strenger JSON-Parser lehnt sie ab.
Wie finde ich die Stelle, an der mein JSON ungültig ist?
Schick es durch einen Validator, der eine Position meldet: python3 -m json.tool file.json oder jq . file.json auf der Kommandozeile, oder ein JSON-Editor, der den Fehler unterstreicht. Der Fehler liegt an der gemeldeten Position oder kurz davor, meist am Ende der vorherigen Zeile.
Warum ist mein JSON ungültig, obwohl es korrekt aussieht?
Suche nach Zeichen, die richtig aussehen, es aber nicht sind: typografische statt gerade Anführungszeichen (häufig nach dem Kopieren aus einem Dokument oder dem Tippen auf dem iPhone), eine unsichtbare Byte-Order-Mark am Dateianfang oder ein echter Tabulator in einem String.
Lässt sich ungültiges JSON automatisch reparieren?
Die häufigen Patzer ja: Abschließende Kommas, einfache Anführungszeichen, Schlüssel ohne Anführungszeichen und Kommentare haben jeweils eine offensichtliche Bedeutung, und Tools wie jsonrepair beheben sie sicher. Eine abgeschnittene Datei lässt sich nicht sicher reparieren, weil ein Reparatur-Tool die Klammern schließt und die fehlenden Daten stillschweigend verloren gehen.

mygems — Entwickelt Smart Json, dessen handgeschriebener Parser jeden dieser Fehler mit Zeile und Spalte benennt und die häufigen repariert.