JSON-Fehler finden und beheben: die häufigsten Ursachen

JSON sieht aus wie JavaScript, ist aber viel strenger. Ein einziges falsches Zeichen reicht, und kein Programm liest die Datei mehr. Die gute Nachricht: Fast alle Fehler gehören zu einer Handvoll Muster. Dieser Ratgeber zeigt sie mit Beispiel und Lösung.

Am schnellsten findest du die Stelle, wenn du das JSON in den JSON-Formatierer einfügst. Er nennt Zeile und Spalte, erklärt den Fehler auf Deutsch, und ein Klick auf die Meldung markiert die Stelle.

So liest du eine Fehlermeldung

Die meisten Parser nennen eine Position. Dabei gibt es zwei Zählweisen:

  • Position (zum Beispiel at position 7 in Chrome und Node.js) zählt die Zeichen ab dem Anfang, beginnend bei 0. Position 7 ist also das achte Zeichen.
  • Zeile und Spalte (zum Beispiel line 1 column 8) zählen ab 1.

Wichtig: Der Parser meldet die Stelle, an der er nicht mehr weiterkommt. Das ist oft nach dem eigentlichen Fehler. Fehlt ein Komma am Ende von Zeile 3, meldet er erst das unerwartete Zeichen am Anfang von Zeile 4. Schau dir deshalb immer auch das Zeichen davor an.

Komma nach dem letzten Eintrag

{
  "name": "Ada",
  "aktiv": true,
}

In JavaScript ist das Komma vor } erlaubt, in JSON nicht. Lösung: das letzte Komma entfernen. Warum das so ist und wie du es dauerhaft vermeidest, steht im Ratgeber Komma am Ende in JSON.

Fehlendes Komma

{
  "name": "Ada"
  "aktiv": true
}

Zwischen zwei Einträgen muss ein Komma stehen. Chrome meldet hier Expected ',' or '}' after property value, Python Expecting ',' delimiter. Die gemeldete Position ist der Anfang von "aktiv" – das fehlende Komma gehört ans Ende der Zeile davor.

Einfache Anführungszeichen und Schlüssel ohne Anführungszeichen

{ 'name': 'Ada', aktiv: true }

JSON kennt nur doppelte Anführungszeichen, und zwar für Texte und für Schlüssel. Korrekt ist:

{ "name": "Ada", "aktiv": true }

Dieser Fehler entsteht oft, wenn ein JavaScript- oder Python-Objekt per Hand kopiert wird. Python gibt Dictionaries mit print() zum Beispiel mit einfachen Anführungszeichen und True, False und None aus – das ist kein JSON. Erzeuge JSON deshalb mit json.dumps() (Python) oder JSON.stringify() (JavaScript) statt mit print() oder String-Verkettung. Weitere Fälle und ihre Lösung zeigt der Ratgeber Einfache Anführungszeichen und Schlüssel ohne Anführungszeichen.

Kommentare

{
  // Port des Servers
  "port": 8080
}

Standard-JSON erlaubt keine Kommentare, weder // noch /* … */. Welche Alternativen es gibt (JSONC, JSON5, YAML), erklärt der Ratgeber Kommentare in JSON.

Unvollständiges JSON

{ "name": "Ada", "sprachen": ["de", "en"

Hier fehlen ] und }. Typische Meldungen sind Unexpected end of JSON input oder Expected ',' or ']' after array element. Ursachen sind meistens abgeschnittene Downloads, leere Server-Antworten oder unvollständig kopierte Texte. Mehr dazu im Ratgeber „Unexpected end of JSON input“.

Zahlen

JSON-Zahlen sehen aus wie in JavaScript, sind aber eingeschränkt. Nicht erlaubt sind:

Falsch Richtig Grund
012 12 keine führenden Nullen
1. 1.0 oder 1 nach dem Punkt muss eine Ziffer stehen
.5 0.5 vor dem Punkt muss eine Ziffer stehen
+1 1 kein Plus-Zeichen am Anfang
0x1F 31 keine Hexadezimalzahlen
NaN, Infinity null oder ein Text gibt es in JSON nicht

Vorsicht bei NaN: Pythons json-Modul schreibt und liest NaN und Infinity standardmäßig, obwohl sie kein gültiges JSON sind. Ein JavaScript-Programm lehnt solche Daten dann ab. Mit json.dumps(daten, allow_nan=False) bricht Python stattdessen mit einem Fehler ab.

Telefonnummern, Postleitzahlen und IDs mit führender Null gehören übrigens in Anführungszeichen: "plz": "01067". Als Zahl wäre die Null weg – oder das JSON ungültig.

Sonderzeichen und Escape-Sequenzen

Innerhalb von Texten haben zwei Zeichen eine Sonderrolle: das Anführungszeichen " und der Backslash \. Beide müssen mit einem Backslash „escaped“ werden. Außerdem dürfen Steuerzeichen wie Zeilenumbrüche und Tabs nicht direkt im Text stehen.

{ "pfad": "C:\Users\ada", "zitat": "Sie sagte "Hallo"" }

Richtig ist:

{ "pfad": "C:\\Users\\ada", "zitat": "Sie sagte \"Hallo\"" }

Erlaubt sind diese Escape-Sequenzen: \", \\, \/, \b, \f, \n (Zeilenumbruch), \r, \t (Tab) und \u mit genau vier Hexadezimalziffern, etwa \u00e9 für „é“. Umlaute und andere Unicode-Zeichen darfst du auch direkt schreiben: "Straße" ist gültiges JSON.

Ein Windows-Pfad wie C:\Users ist ein Klassiker: \U ist keine gültige Escape-Sequenz. Chrome meldet Bad escaped character, Safari Invalid escape character U. Ein echter Zeilenumbruch mitten in einem Text führt in Chrome zu Bad control character in string literal. Alle Escape-Regeln mit Beispielen erklärt der Ratgeber Sonderzeichen in JSON escapen.

Werte, die es in JSON nicht gibt

JSON kennt genau sechs Arten von Werten: Objekte, Listen (Arrays), Texte (Strings), Zahlen, true/false und null. Nicht dazu gehören zum Beispiel:

  • undefined – JSON.stringify() lässt Eigenschaften mit undefined einfach weg.
  • Datumswerte – JSON.stringify() macht aus einem Date einen Text wie "1970-01-01T00:00:00.000Z". Beim Einlesen bleibt es ein Text.
  • Funktionen, NaN und Infinity – sie werden weggelassen oder zu null.
  • True, False, None aus Python – in JSON heißen sie true, false und null.

HTML statt JSON

Beginnt die Meldung mit Unexpected token '<' und steht dahinter etwas wie "<!DOCTYPE "..., dann hast du gar kein JSON bekommen, sondern eine HTML-Seite – meist eine Fehler- oder Login-Seite des Servers. Wie du das prüfst und behebst, steht im Ratgeber „Unexpected token“ in JSON.

Doppelte Schlüssel

{ "id": 1, "name": "Ada", "id": 2 }

Das ist kein Syntaxfehler: Der JSON-Standard (RFC 8259) sagt nur, Schlüssel sollten eindeutig sein. Was ein Programm daraus macht, ist aber nicht festgelegt. JSON.parse() in JavaScript und json.loads() in Python behalten stillschweigend den letzten Wert, hier also "id": 2. Andere Programme nehmen den ersten oder melden einen Fehler.

Doppelte Schlüssel sind fast immer ein Versehen, etwa nach einem Zusammenführen zweier Dateien. Der JSON-Formatierer behält beim Formatieren beide Einträge und zeigt einen Hinweis mit der Position des ersten doppelten Schlüssels.

Unsichtbares Zeichen am Anfang (BOM)

Manche Windows-Programme speichern Textdateien mit einem unsichtbaren „Byte Order Mark“ (BOM, das Zeichen U+FEFF) am Anfang. Chrome meldet dann Unexpected token '' – mit einem scheinbar leeren Zeichen in den Anführungszeichen –, Python Unexpected UTF-8 BOM. Speichere die Datei als „UTF-8“ ohne BOM, oder lies sie in Python mit encoding="utf-8-sig". Der JSON-Formatierer überspringt ein BOM am Anfang, wie es der Standard Parsern erlaubt. Wie du ein BOM erkennst, entfernst und dauerhaft vermeidest, steht im Ratgeber BOM am Dateianfang.

Checkliste

  1. Fehlerstelle bestimmen: Zeile und Spalte, und das Zeichen davor ansehen.
  2. Kommas prüfen: zwischen allen Einträgen eines, nach dem letzten keines.
  3. Nur doppelte Anführungszeichen, auch um alle Schlüssel.
  4. Keine Kommentare, kein undefined, kein NaN.
  5. Backslashes in Texten verdoppeln, Zeilenumbrüche als \n schreiben.
  6. Bekommst du HTML statt JSON, liegt das Problem beim Server, nicht im Text.

Einzelne Meldungen im Detail: „Unexpected non-whitespace character after JSON“ und JSONDecodeError in Python.

Am einfachsten vermeidest du all das, indem du JSON nie von Hand zusammensetzt, sondern immer von einer Bibliothek erzeugen lässt.