„Unexpected token … in JSON at position …“ – Ursache und Lösung
Die Meldung „Unexpected token“ heißt: Der Parser hat an einer Stelle ein Zeichen gefunden, das dort in JSON nicht stehen darf. Welches Zeichen das ist, verrät die Meldung – und damit fast immer auch die Ursache.
So sieht die Meldung aus
Jede JavaScript-Engine formuliert den Fehler anders. Für dasselbe Problem – eine HTML-Seite statt JSON – lauten die Meldungen:
| Umgebung | Meldung |
|---|---|
| Chrome, Edge, Node.js (aktuell) | Unexpected token '<', "<!DOCTYPE "... is not valid JSON |
| Ältere Chrome- und Node.js-Versionen | Unexpected token < in JSON at position 0 |
| Firefox | JSON.parse: unexpected character at line 1 column 1 of the JSON data |
| Safari | JSON Parse error: Unrecognized token '<' |
Python (json.loads) |
Expecting value: line 1 column 1 (char 0) |
„Position 0“ bedeutet: das erste Zeichen. Positionen zählen ab 0, Zeilen und Spalten ab 1.
Das unerwartete Zeichen steht in der Meldung in Anführungszeichen ('<') oder direkt nach „token“ (token <). Die folgenden Abschnitte gehen die häufigsten Zeichen durch.
< am Anfang: Du hast HTML bekommen
Ein < an Position 0 ist der häufigste Fall. Dein Code erwartet JSON, bekommt aber eine HTML-Seite, die mit <!DOCTYPE html> oder <html> beginnt. Typische Gründe:
- Die URL ist falsch, und der Server antwortet mit seiner 404-Seite.
- Der Server hat einen Fehler (500) und liefert eine Fehlerseite.
- Die Sitzung ist abgelaufen, und die Anfrage landet auf einer Login-Seite.
- In einer Single-Page-App liefert der Entwicklungsserver für jede unbekannte Adresse die
index.htmlaus – auch für einen falsch geschriebenen API-Pfad.
So findest du es heraus: Öffne im Browser die Entwicklertools, Tab „Netzwerk“, und sieh dir die Antwort der Anfrage an. Steht dort HTML, liegt das Problem bei URL oder Server, nicht beim Parsen.
Im Code prüfst du den Status, bevor du parst:
const response = await fetch('/api/kunden');
if (!response.ok) {
throw new Error(`Server antwortet mit ${response.status}`);
}
const type = response.headers.get('content-type') ?? '';
if (!type.includes('application/json')) {
throw new Error(`Erwartet JSON, erhalten: ${type}`);
}
const kunden = await response.json();
So bekommst du eine klare Meldung wie „Server antwortet mit 404“ statt eines rätselhaften Parser-Fehlers.
o an Position 1: Das Objekt ist schon geparst
Unexpected token o in JSON at position 1 (ältere Versionen) oder "[object Object]" is not valid JSON (aktuelles Chrome und Node.js) entsteht, wenn du JSON.parse() auf etwas anwendest, das schon ein Objekt ist. JavaScript macht daraus zuerst den Text [object Object] – und das zweite Zeichen, o, ist kein gültiges JSON.
const response = await fetch('/api/kunde/1');
const kunde = await response.json(); // ist bereits ein Objekt
JSON.parse(kunde); // Fehler
response.json(), Axios und viele andere Bibliotheken parsen die Antwort schon für dich. Lass das zweite JSON.parse() einfach weg.
u an Position 0: undefined
Steht undefined im Text, meldet Chrome "undefined" is not valid JSON, ältere Versionen Unexpected token u in JSON at position 0. Meist steckt eine Variable dahinter, die noch keinen Wert hat, oder ein Speicherwert, der als Text "undefined" abgelegt wurde:
localStorage.setItem('einstellungen', undefined); // speichert den Text "undefined"
JSON.parse(localStorage.getItem('einstellungen')); // Fehler
Prüfe den Wert vor dem Parsen und speichere nur, was JSON.stringify() erzeugt hat.
', / oder ein Buchstabe: Syntaxfehler im Text
Kommt das JSON aus einer Datei oder wurde es von Hand geschrieben, zeigt das Zeichen meist direkt den Fehler:
| Zeichen | Wahrscheinliche Ursache | Lösung |
|---|---|---|
' |
einfache Anführungszeichen | nur " verwenden |
/ |
ein Kommentar // oder /* */ |
Kommentar entfernen, siehe Kommentare in JSON |
] oder } |
Komma vor der schließenden Klammer | Komma entfernen, siehe Komma am Ende |
T, F, N |
Python-Werte True, False, None |
true, false, null schreiben |
N oder I |
NaN oder Infinity |
null oder einen Text verwenden |
. oder + |
Zahl wie .5 oder +1 |
0.5 bzw. 1 schreiben |
Nicht jede Engine nennt hier „Unexpected token“. Für ein Komma vor } meldet Chrome zum Beispiel Expected double-quoted property name, für einen Schlüssel ohne Anführungszeichen Expected property name or '}'. Die Ursache ist dieselbe.
Ein unsichtbares Zeichen
Sieht das Zeichen in der Meldung leer aus – Unexpected token '' –, steht am Anfang der Datei ein unsichtbares Byte Order Mark (BOM). Speichere die Datei als UTF-8 ohne BOM. Details im Ratgeber JSON-Fehler finden und beheben.
Zeichen nach dem Ende
Eine verwandte Meldung ist Unexpected non-whitespace character after JSON at position … (Chrome, Node.js), in Firefox unexpected non-whitespace character after JSON data, in Python Extra data. Der Parser hat einen vollständigen JSON-Wert gelesen, danach kommt aber noch etwas. Alle Ursachen und Lösungen dazu stehen im Ratgeber „Unexpected non-whitespace character after JSON“.
{"id": 1}
{"id": 2}
Ein JSON-Dokument enthält genau einen Wert. Mehrere Objekte gehören in eine Liste: [{"id": 1}, {"id": 2}]. Oft ist die Datei aber absichtlich so aufgebaut: Das Format JSON Lines (auch NDJSON) hat ein JSON-Objekt pro Zeile, zum Beispiel in Log-Dateien und Datenexporten. Solche Dateien liest du Zeile für Zeile:
const eintraege = text
.split('\n')
.filter((zeile) => zeile.trim() !== '')
.map((zeile) => JSON.parse(zeile));
Die Stelle schnell finden
Bei langen Texten ist „position 4711“ wenig hilfreich. Füge das JSON in den JSON-Formatierer ein: Er zeigt die Stelle mit Zeile und Spalte, beschreibt den Fehler auf Deutsch und markiert sie in der Eingabe, wenn du auf die Meldung klickst. Die Prüfung läuft in deinem Browser; das JSON wird nicht hochgeladen.