SyntaxError: Unexpected token o in JSON at position 1 — dieses kleine o ist das zweite Zeichen von [object Object]. Es bedeutet, dass Sie ein JavaScript-Objekt direkt an JSON.parse() statt einen JSON-String übergeben haben. Dieser Artikel erklärt jede Variante dieses Fehlers und wie Sie jeden Fall in unter einer Minute beheben.
Warum die Fehlermeldung "token o" sagt
Wenn Sie einen Nicht-String an JSON.parse() übergeben, wandelt JavaScript ihn zunächst in einen String um. Ein einfaches Objekt wird zu "[object Object]". Der Parser sieht [ an Position 0 (gültig — Beginn eines Arrays), dann o an Position 1 (ungültig — kein gültiges Array-Element). Daher: Unexpected token o at position 1.
JSON.parse({})
// Gleichbedeutend mit: JSON.parse("[object Object]")
// SyntaxError: Unexpected token o in JSON at position 1Häufigste Ursache: response.json() nicht awaited
Das ist die Hauptquelle dieses Fehlers in realen Codebasen. Ein Response-Objekt aus fetch() ist kein String — es ist ein ReadableStream-Wrapper. Es an JSON.parse() zu übergeben, wandelt es in "[object Response]" um.
// ❌ Falsch — response ist ein Response-Objekt, kein String
const response = await fetch('/api/user');
const data = JSON.parse(response);
// SyntaxError: Unexpected token o in JSON at position 1
// ✓ Richtig — der Browser parst den Stream als JSON
const data = await response.json(); Analog dazu: Wenn Sie response.text() ohne await aufrufen, erhalten Sie ein Promise-Objekt (das zu "[object Promise]" wird).
// ❌ Fehlendes await — text ist ein Promise, kein String
const text = response.text();
const data = JSON.parse(text);
// SyntaxError: Unexpected token o in JSON at position 1
// ✓ Richtig
const text = await response.text();
const data = JSON.parse(text);Andere Objekte, die diesen Fehler auslösen
| Was Sie übergeben haben | Wozu JS es konvertiert | Fehler-Token |
|---|---|---|
{} oder ein beliebiges einfaches Objekt | "[object Object]" | token o an Position 1 |
undefined | "undefined" | token u an Position 0 |
true / false | "true" / "false" — tatsächlich gültiges JSON! | kein Fehler |
Ein Response-Objekt | "[object Response]" | token o an Position 1 |
Ein Promise | "[object Promise]" | token o an Position 1 |
null | "null" — gültiges JSON | kein Fehler (gibt null zurück) |
Ursache: Objekt übergeben statt zu serialisieren
Ein verwandter Fehler: zu versuchen, ein JavaScript-Objekt zu "parsen", das Sie bereits im Speicher haben. JSON.parse() nimmt einen String; wenn Sie bereits ein Objekt haben, müssen Sie es überhaupt nicht parsen.
const config = { host: 'localhost', port: 3000 };
// ❌ Sinnlos — config ist bereits ein Objekt
const parsed = JSON.parse(config);
// ✓ Für eine tiefe Kopie: structuredClone oder stringify + parse
const clone = JSON.parse(JSON.stringify(config));
// ✓ Zum Versenden: JSON.stringify
const body = JSON.stringify(config);Ursache: Python oder anderes Backend liefert falschen Content-Type
Manchmal liefert der Server eine Klartext-Fehlermeldung (z. B. "ok" oder "not found") mit Status 200 und ohne Content-Type-Header. Das Frontend nimmt JSON an, ruft response.json() auf und erhält einen Unexpected-Token-Fehler, weil der Body kein gültiges JSON ist.
// Server sendet den Literal-String: ok
// Browser versucht, ihn als JSON zu parsen:
JSON.parse("ok")
// SyntaxError: Unexpected token o in JSON at position 0Lösung: Prüfen Sie immer response.ok und response.headers.get('Content-Type'), bevor Sie response.json() aufrufen:
const response = await fetch('/api/action');
if (!response.ok) {
const text = await response.text(); // sicher — vielleicht kein JSON
throw new Error(`HTTP ${response.status}: ${text}`);
}
const data = await response.json();Seltenere [object X]-Varianten
Jeder Wert, dessen toString() einen String zurückliefert, der mit [object beginnt, löst denselben Fehler an Position 1 aus. Abgesehen von [object Object] sind das die, die einem in echtem Code wirklich begegnen:
[object Module]— Übergabe des Ergebnisses eines dynamischen Imports:const mod = await import('./data.json', { with: { type: 'json' } }); Sie wollenmod.default, nichtmod.[object AsyncFunction]— die Referenz auf eine async-Funktion übergeben, anstatt sie aufzurufen: Serialisieren Siefn()(den aufgelösten Wert der Promise), nichtfn.[object HTMLDocument]— versehentlichdocumentübergeben (z. B. aus einem alten Debugger-Snippet).[object FormData]—fetch(url, { body: formData })ist in Ordnung, aberJSON.parse(formData)nicht — konvertieren Sie zuerst mitObject.fromEntries(formData).
Schnelle Fix-Checkliste
- fetch + JSON.parse? Ersetzen durch
await response.json(). - Fehlt irgendwo in der Kette ein await? Jeder
async-Aufruf vor dem Parse muss awaited werden. - Schon ein Objekt? Kein Parsen nötig — direkt verwenden oder mit
structuredClone()klonen. - Liefert der Server bei Fehlern Nicht-JSON? Mit
response.text()lesen, nicht mitresponse.json(), wenn die Antwort möglicherweise kein JSON ist.
Häufig gestellte Fragen
Was bedeutet "Unexpected token o in JSON at position 1"?
Sie haben ein JavaScript-Objekt an JSON.parse() übergeben. JavaScript wandelt das Objekt in den String "[object Object]" um; der Parser akzeptiert [ an Position 0, lehnt aber das o an Position 1 ab.
Wie behebe ich es bei fetch?
Rufen Sie nicht JSON.parse(response) auf. Verwenden Sie await response.json() — das liest den Response-Stream und parst ihn für Sie. Stellen Sie sicher, dass jeder Schritt der Kette awaited ist.
Brauche ich JSON.parse, wenn ich bereits ein Objekt habe?
Nein. JSON.parse() wandelt nur einen JSON-String in einen Wert um. Wenn Sie bereits ein Objekt halten, verwenden Sie es direkt oder klonen Sie tief mit structuredClone() statt mit JSON.parse(JSON.stringify(obj)).
Ist "Unexpected token o" dasselbe wie "[object Object] is not valid JSON"?
Sie haben dieselbe Grundursache — ein Objekt, das vor dem Parsen in einen String umgewandelt wurde. Neuere V8-Builds geben den Wortlaut [object Object] is not valid JSON aus; ältere geben Unexpected token o aus. Siehe "[object Object] is not valid JSON" beheben für die vollständige Analyse.
Die Rohantwort prüfen
Wenn Sie nicht wissen, was Ihre API zurückgibt, fügen Sie den Roh-Body in JSON Fix ein, um ihn zu validieren. Ist es kein gültiges JSON, sagt Ihnen der Validator genau, was falsch ist.
- JSON Fix — JSON im Browser validieren und reparieren
- "[object Object] is not valid JSON" beheben — der vollständige Leitfaden zu JSON-Syntaxfehlern
- Unexpected end of JSON input — wenn dem Parser die Daten ausgehen, bevor die Struktur vollständig ist
- Umgang mit kaputtem JSON in JavaScript — sichere Parse-Muster und Fehlerbehandlung