← Alle Artikel

Unexpected Token o in JSON an Position 1: Ursachen und Fix

Dieses kleine „o" ist das zweite Zeichen von „[object Object]". Du hast JSON.parse() ein JavaScript-Objekt statt eines Strings übergeben. Hier jede Variante dieses Fehlers und der Einzeiler-Fix für jede.

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 1

Hä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 habenWozu JS es konvertiertFehler-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 JSONkein 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 0

Lö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 wollen mod.default, nicht mod.
  • [object AsyncFunction] — die Referenz auf eine async-Funktion übergeben, anstatt sie aufzurufen: Serialisieren Sie fn() (den aufgelösten Wert der Promise), nicht fn.
  • [object HTMLDocument] — versehentlich document übergeben (z. B. aus einem alten Debugger-Snippet).
  • [object FormData]fetch(url, { body: formData }) ist in Ordnung, aber JSON.parse(formData) nicht — konvertieren Sie zuerst mit Object.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 mit response.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.