Ein Fehler wegen eines unerwarteten Tokens in JSON bedeutet, dass Ihr Parser beim Lesen eines vermeintlich gültigen JSON auf ein Zeichen gestoßen ist, das er nicht erwartet hat. Es ist fast nie ein mysteriöser Fehler. Er geht auf eine von sechs konkreten Ursachen zurück: ein nachgestelltes Komma, einfache Anführungszeichen, eine HTML-Antwort, ein unsichtbares BOM, nicht in Anführungszeichen gesetzte Schlüssel oder Kommentare. Diese Anleitung geht auf jede einzelne ein und zeigt Ihnen vor allem, wie Sie die genaue Zeile und Spalte finden, anstatt zu raten.
Das Frustrierende ist, dass die Fehlermeldung selten auf das eigentliche Problem hinweist. Unexpected token < in JSON at position 0 bedeutet nicht, dass Ihr JSON defekt ist. Es bedeutet, dass Sie überhaupt kein JSON betrachten. Sobald Sie verstehen, was der Parser Ihnen sagt, dauern die meisten dieser Korrekturen weniger als eine Minute.
Was „Unerwartetes Token in JSON“ tatsächlich bedeutet#
JSON ist ein strenges Format. Der Parser liest Ihren String Zeichen für Zeichen und baut einen Wert auf. Sobald er etwas sieht, das an dieser Position nicht legal vorkommen kann, stoppt er und wirft einen SyntaxError. Das „Token“ ist das Zeichen, das ihn ausgelöst hat.
Moderne Engines formulieren die Meldung unterschiedlich, was zur Verwirrung beiträgt:
- V8 (Chrome, Node 20+):
Unexpected token 'x', "...context..." is not valid JSON - Älteres Node / Chrome:
Unexpected token x in JSON at position 42 - Firefox:
JSON.parse: unexpected character at line 2 column 5 of the JSON data - Safari:
JSON Parse error: Unexpected identifier
Das nützlichste Feld ist die Position oder die Zeilen-/Spaltennummer. Firefox gibt Ihnen direkt Zeile und Spalte an. V8 liefert eine Byte-Position und einen Ausschnitt des umgebenden Texts. Lesen Sie das zuerst, bevor Sie etwas anderes lesen.
Der schnellste Weg, eine kryptische Position in ein sichtbares Problem zu verwandeln, ist, den rohen String in einen Validator einzufügen, der die fehlerhafte Zeile hervorhebt. Unser kostenloser JSON-Formatter und -Validator markiert die genaue Stelle und sagt Ihnen, was dort erwartet wurde, was den Großteil der folgenden Fehlersuche auf einen Blick zusammenfasst.
Die 6 wahren Ursachen (und wie man sie behebt)#
Hier ist die ehrliche Verteilung. In der Praxis sind die überwältigende Mehrheit dieser Fehler die Ursachen 1 bis 3. Die letzten drei sind seltener, kosten aber Stunden, weil sie unsichtbar oder kontraintuitiv sind.
| Ursache | Typische Meldung | Hinweis |
|---|---|---|
| HTML statt JSON | Unexpected token < an Position 0 | Das erste Zeichen ist < (ein <!DOCTYPE oder <html>) |
| Nachkomma | Unexpected token } oder ] | Ein Komma steht vor einer schließenden Klammer |
| Einfache Anführungszeichen | Unexpected token ' | Schlüssel oder Zeichenketten verwenden ' statt " |
| BOM / versteckte Zeichen | Unexpected token an Position 0 bei gültigem JSON | Sieht perfekt aus, aber Fehler ganz am Anfang |
| Unquotierte Schlüssel | Unexpected token nahe einem Schlüssel | Ein Schlüssel wie name: hat keine Anführungszeichen |
| Kommentare | Unexpected token / | Ein // oder /* */ Kommentar existiert in der Datei |
Ursache 1: Sie haben HTML erhalten, nicht JSON (der Fall "token <")#
Das ist der Fall, der die meisten verwirrt, und fast kein anderer Leitfaden erklärt ihn. Wenn Sie Unexpected token < in JSON at position 0 sehen, ist das < der Beginn eines HTML-Tags. Ihr fetch-Aufruf erwartete JSON, aber der Server hat eine HTML-Seite zurückgegeben.
Das bedeutet normalerweise eines von diesen:
- Der Endpunkt hat eine 404- oder 500-Fehlerseite (HTML) zurückgegeben, nicht Ihre API-Daten.
- Sie haben die falsche URL getroffen und die
index.htmlder App erhalten. - Ein Proxy, eine Anmeldeseite oder ein Ratenbegrenzer hat die Anfrage abgefangen und eine HTML-Seite ausgeliefert.
Die Lösung liegt nicht in Ihrem JSON. Protokollieren Sie den rohen Antworttext, bevor Sie ihn parsen:
const res = await fetch(url);
const text = await res.text();
console.log(res.status, text.slice(0, 200)); // sehen, was Sie tatsächlich erhalten haben
const data = JSON.parse(text);
Wenn text mit <!DOCTYPE html> beginnt, haben Sie es gefunden. Überprüfen Sie den Statuscode und die URL. Bestätigen Sie auch, dass der Content-Type der Antwort application/json ist, nicht text/html.
Ursache 2: Nachkomma#
JSON erlaubt kein Komma nach dem letzten Element in einem Objekt oder Array. JavaScript-Objektliterale tun das, weshalb dies durchrutscht. Sie schreiben JSON von Hand wie JS, und der Parser lehnt es ab.
{
"name": "Ada",
"role": "engineer", // dieses nachgestellte Komma ist ungültig
}
Entfernen Sie das Komma nach "engineer". Gleiches gilt für Arrays: [1, 2, 3,] ist ungültiges JSON. Ein Formatierer zeigt diese sofort an, da das störende Komma direkt vor einer } oder ] steht.
Ursache 3: Einfache Anführungszeichen statt doppelter#
JSON erfordert doppelte Anführungszeichen sowohl für Schlüssel als auch für Zeichenkettenwerte. Einfache Anführungszeichen sind eine JavaScript-Gewohnheit, die JSON nicht teilt.
{ 'name': 'Ada' } // ungültig: überall einfache Anführungszeichen
{ "name": "Ada" } // gültig
Wenn Sie die Quelle kontrollieren, ersetzen Sie jedes ' durch ". Wenn die fehlerhafte Zeichenkette von einer Stelle kommt, die Sie nicht bearbeiten können, ersetzen Sie nicht blind mit Regex (Apostrophe innerhalb von Werten würden brechen). Verwenden Sie stattdessen ein Tool, das die Struktur versteht.
Ursache 4: Das unsichtbare BOM (und Windows CRLF)#
Dieser Fall verwirrt Leute stundenlang, weil das JSON perfekt aussieht. Sie sehen gültiges JSON, fügen es ein, und der Parser wirft trotzdem einen Fehler an Position 0. Der Übeltäter ist ein Byte-Order-Mark, ein verstecktes U+FEFF-Zeichen, das einige Editoren (und PowerShells >-Umleitung unter Windows) UTF-8-Dateien voranstellen.
Der Parser liest das BOM als erstes Token und lehnt es ab. Um zu bestätigen, überprüfen Sie die ersten Bytes:
const text = fs.readFileSync("data.json", "utf8");
console.log(text.charCodeAt(0)); // 65279 bedeutet, dass ein BOM vorhanden ist
const clean = text.replace(/^/, "");
JSON.parse(clean);
Speichern Sie die Datei als UTF-8 ohne BOM in Ihrem Editor (VS Code zeigt die Kodierung in der Statusleiste an; klicken Sie darauf und wählen Sie "Speichern mit Kodierung"). Unter Windows bevorzugen Sie Out-File -Encoding utf8NoBOM oder Set-Content gegenüber der >-Umleitung, die das BOM einfügen kann. Vereinzelte Wagenrückläufe von CRLF-Zeilenumbrüchen können ähnliche Position-0-Probleme verursachen, wenn JSON verkettet oder gestreamt wird.
Ursache 5: Unquotierte Schlüssel#
In JavaScript ist { name: "Ada" } in Ordnung. In JSON muss der Schlüssel in Anführungszeichen stehen: { "name": "Ada" }. Dies passiert meistens, wenn jemand ein JS-Objektliteral in eine .json-Datei oder einen API-Body kopiert.
Die Lösung ist, jeden Schlüssel in doppelte Anführungszeichen zu setzen. Wenn Sie ein großes Objekt haben, wird ein Formatierer Schlüssel nicht automatisch in Anführungszeichen setzen (das wäre Raten), aber er zeigt auf den genauen Schlüssel, der fehlgeschlagen ist, damit Sie ihn schnell beheben können.
Ursache 6: Kommentare#
JSON hat keine Kommentare. Weder // noch /* */. Leute fügen sie aus Gewohnheit in Konfigurationsdateien ein, und dann scheitert ein strikter Parser.
{
// App-Einstellungen <- ungültig, JSON verbietet Kommentare
"port": 3000
}
Entfernen Sie die Kommentare. Wenn Sie wirklich kommentierte Konfiguration benötigen, verwenden Sie ein dafür ausgelegtes Format (JSON5 oder JSONC, das VS Code für seine eigenen Einstellungen verwendet) und parsen Sie es mit einer Bibliothek, die diesen Dialekt unterstützt, nicht mit einfachem JSON.parse.
So finden Sie die exakte fehlerhafte Zeile und Spalte#
Diese Fähigkeit verwandelt eine 30-minütige Suche in eine 30-Sekunden-Korrektur und ist der Teil, den die meisten Suchergebnisse komplett auslassen. Der Fehler gibt Ihnen eine Position; hier erfahren Sie, wie Sie diese in einen tatsächlichen Ort umwandeln.
Schritt 1: Lesen Sie die Position oder Zeile/Spalte aus dem Fehler#
Erfassen Sie den vollständigen Fehler, nicht nur das erste Wort. In Node oder im Browser umschließen Sie das Parsen:
try {
JSON.parse(raw);
} catch (e) {
console.error(e.message); // enthält Position oder Zeile:Spalte
}
Firefox gibt Ihnen bereits Zeile X Spalte Y. V8 gibt eine Byte-Position aus. Notieren Sie diese Zahl, Sie werden sie im nächsten Schritt verwenden.
Schritt 2: Springen Sie zu dieser Position im Rohstring#
Wenn Sie eine Byte-Position haben (z.B. 142), schneiden Sie den String um diese Stelle herum aus, um den Kontext zu sehen, den der Parser hatte:
console.log(raw.slice(130, 160));
Das Zeichen an der Grenze ist Ihr Übeltäter. Wenn Sie 15 Zeichen auf jeder Seite sehen, wird die Ursache fast immer offensichtlich: ein überflüssiges Komma, ein einfaches Anführungszeichen, ein HTML-Tag.
Schritt 3: Fügen Sie es in einen Validator ein, der die Stelle hervorhebt#
Das manuelle Überprüfen von Positionen in einem langen String ist langsam und fehleranfällig. Fügen Sie das rohe JSON in den JSON-Formatter und -Validator ein, der die Struktur verschönert und die fehlerhafte Zeile mit einer klaren Nachricht darüber markiert, was erwartet wurde. Die Neuformatierung allein zeigt oft das Problem, da ein falsch platziertes Komma oder eine nicht geschlossene Klammer visuell offensichtlich wird, sobald die Verschachtelung korrekt eingerückt ist.
Schritt 4: Korrigieren, erneut validieren, dann im Code testen#
Wenden Sie die Korrektur an, validieren Sie erneut, um zu bestätigen, dass der String nun sauber ist, und führen Sie dann Ihren eigentlichen Codepfad aus. Wenn das JSON von einer API stammt, beheben Sie es nach Möglichkeit an der Quelle, anstatt den String clientseitig zu patchen. Eine saubere Antwort ist immer besser als eine defensive .replace()-Kette.
Den Fehler verhindern, bevor er auftritt#
Die meisten dieser Fehler lassen sich mit ein paar Gewohnheiten vermeiden. Ziel ist es, JSON nie von Hand zu schreiben, wenn Ihre Tools es korrekt für Sie generieren können.
- Erstellen Sie JSON niemals durch Zeichenkettenverkettung. Verwenden Sie
JSON.stringify(), damit Anführungszeichen und Kommas immer korrekt sind. Wenn Sie unsicher sind, wie die Ausgabe aussehen soll, behandelt unser Leitfaden zum Formatieren von JSON in JavaScriptJSON.stringifyund seine Tücken. - Protokollieren Sie immer die rohe Antwort, bevor Sie sie parsen, wenn Sie ein API-Ergebnis verarbeiten, sodass ein
<(HTML) sofort sichtbar wird, anstatt als mysteriöser Token-Fehler. - Überprüfen Sie zuerst den HTTP-Status. Wenn
res.okfalsch ist, lesen Sie es als Text und zeigen Sie die Fehlerseite an, anstatt blind zu parsen. - Speichern Sie Konfigurationsdateien als UTF-8 ohne BOM und halten Sie einen Formatierer in Ihrem täglichen Workflow bereit. Wenn Sie viel mit JSON arbeiten, erfahren Sie, warum der JSON-Formatierer ein tägliches Werkzeug für Entwickler ist, um diese Probleme zu erkennen, bevor sie ausgeliefert werden.
- Linten Sie Ihr JSON in CI. Ein Schema oder ein einfacher Parse-Schritt in Ihrer Pipeline fängt ein abschließendes Komma ab, bevor es in die Produktion gelangt.
Fazit: Position lesen, dann Ursache zuordnen#
Ein unerwartetes Token in einem JSON-Fehler wirkt zufällig, bis man erkennt, dass es sich um eines von sechs vorhersehbaren Problemen handelt, und der Parser hat bereits verraten, wo man suchen muss. Beginnen Sie mit der Position oder Zeile und Spalte, dann ordnen Sie das fehlschlagende Zeichen der Ursache zu: < bedeutet HTML, ein Komma vor } bedeutet ein nachgestelltes Komma, ein ' bedeutet einfache Anführungszeichen, und ein Fehler an Position 0 bei perfekt aussehendem JSON deutet fast immer auf ein verstecktes BOM hin.
Wenn Sie nicht mehr auf Byte-Offsets starren möchten, fügen Sie die Zeichenfolge in einen Validator ein, der die genaue Zeile hervorhebt und zeigt, was erwartet wurde. Dieser einzelne Schritt ersetzt den Großteil der manuellen Suche und bringt Sie zurück zum Entwickeln.
Häufig gestellte Fragen#
Was bedeutet "Unexpected token < in JSON at position 0"?
Es bedeutet, dass die Antwort, die Sie zu parsen versuchen, mit einem < beginnt, dem Anfang eines HTML-Tags, nicht mit JSON. Ihr Code erwartet JSON, aber der Server hat eine HTML-Seite zurückgegeben, normalerweise eine 404- oder 500-Fehlerseite, eine Login-Weiterleitung oder die falsche URL. Protokollieren Sie den rohen Antworttext und überprüfen Sie den Statuscode, um dies zu bestätigen.
Warum wirft mein gültig aussehendes JSON einen Fehler an Position 0?
Die häufigste Ursache ist ein unsichtbares Byte Order Mark (BOM), ein verstecktes U+FEFF-Zeichen, das einige Editoren und Windows-Shells zu UTF-8-Dateien hinzufügen. Das JSON sieht perfekt aus, aber der Parser liest zuerst das BOM und lehnt es ab. Entfernen Sie es mit text.replace(/^/, "") oder speichern Sie die Datei als UTF-8 ohne BOM.
Sind nachgestellte Kommas in JSON erlaubt?
Nein. Ein Komma nach dem letzten Element in einem Objekt oder Array ist ungültiges JSON, obwohl JavaScript-Objektliterale es erlauben. Dies ist eine der häufigsten Ursachen für unerwartete Token-Fehler. Entfernen Sie das Komma direkt vor einem } oder ].
Kann ich einfache Anführungszeichen in JSON verwenden?
Nein. JSON erfordert doppelte Anführungszeichen für jeden Schlüssel und jeden String-Wert. Einfache Anführungszeichen sind in JavaScript gültig, aber nicht in JSON, daher wird { 'name': 'Ada' } einen Fehler werfen, während { "name": "Ada" } korrekt geparst wird.
Wie finde ich die genaue Zeile, die den JSON-Fehler verursacht? Lesen Sie zuerst die Position oder Zeile und Spalte aus der Fehlermeldung, da der Parser angibt, wo er fehlgeschlagen ist. Schneiden Sie den rohen String um diese Position herum, um den Kontext zu sehen, oder fügen Sie den gesamten String in den JSON-Formatierer und Validator ein, um die fehlerhafte Zeile hervorzuheben und zu zeigen, welches Zeichen dort erwartet wurde.
Unterstützt JSON Kommentare?
Reines JSON unterstützt keinerlei Kommentare, daher führen // und /* */ zu einem unerwarteten Token-Fehler. Wenn Sie kommentierte Konfiguration benötigen, verwenden Sie JSON5 oder JSONC (den Dialekt, den VS Code für seine Einstellungen verwendet) und parsen Sie es mit einer Bibliothek, die diese Formate versteht, anstatt mit JSON.parse.



