← Alle Artikel

Unexpected Token u in JSON an Position 0: undefined parsen

Der Fehler „Unexpected token u" bedeutet, dass du JSON.parse(undefined) aufgerufen hast. Lerne, warum undefined zu „undefined" wird, wie du dich absicherst und einen sicheren Parse-Helper.

SyntaxError: Unexpected token 'u', "undefined" is not valid JSON (ältere Engines: Unexpected token u in JSON at position 0) bedeutet fast immer, dass du JSON.parse(undefined) aufgerufen hast. JavaScript wandelt undefined in den Text "undefined" um, und der Parser hängt am führenden u. Hier ist der Grund und wie du es behebst.

Wie der Fehler aussieht

// V8 (Chrome / Node / Edge)
SyntaxError: "undefined" is not valid JSON
SyntaxError: Unexpected token 'u', "undefined" is not valid JSON
SyntaxError: Unexpected token u in JSON at position 0   // älteres V8

// Firefox
SyntaxError: JSON.parse: unexpected character at line 1 column 1

// Safari
SyntaxError: JSON Parse error: Unexpected identifier "undefined"

Das u an Position 0 ist der erste Buchstabe des Strings "undefined" —— der Parser hat nie echte Daten bekommen.

Warum es passiert: du hast undefined geparst

JSON.parse() coerciert sein Argument zuerst in einen String. Übergib undefined und es parst den Literal-Text "undefined", was kein gültiges JSON ist. Der Wert ist normalerweise undefined, weil:

  • Eine Variable oder ein Funktionsargument nie zugewiesen wurde
  • Eine Objekt-Property nicht existiert (Tippfehler oder falsche Form): obj.missing
  • Ein async-Wert noch nicht bereit ist (vor await geparst)
  • Eine Funktion ohne return als Quelle genutzt wurde

Kaputtes Beispiel

const cached = localStorage.getItem('settings'); // fehlender Key → null, OK
const draft  = window.appState?.draft;            // Property fehlt → undefined
const data   = JSON.parse(draft);                 // ❌ "undefined" is not valid JSON

Behobenes Beispiel

// Guard vor dem Parsen
const data = draft ? JSON.parse(draft) : null;

// Oder ein sicherer Helper
function safeParse(text, fallback = null) {
  if (typeof text !== 'string' || text.trim() === '') return fallback;
  try { return JSON.parse(text); } catch { return fallback; }
}
const data2 = safeParse(draft);

Hinweis: JSON.parse(null) wirft nicht —— es gibt null zurück —— und localStorage.getItem() gibt für einen fehlenden Key null (nicht undefined) zurück. Ein u-Fehler zeigt also speziell auf einen undefined-Wert, nicht auf einen fehlenden Storage-Key.

SyntaxError vs. TypeError: warum du diesen hier bekommst

Ein subtiles, aber nützliches Detail: JSON.parse(undefined) wirft einen SyntaxError, keinen TypeError. Warum? Weil die Spec sagt, dass JSON.parse sein Argument zuerst in einen String coerciert ("undefined") und dann diesen String parst. Der Fehler ist „dieser String ist kein gültiges JSON", nicht „du hast den falschen Typ übergeben". Deshalb erzeugen JSON.parse(undefined) und JSON.parse("undefined") die identische Position-0-Meldung.

Kontrast zu APIs, die tatsächlich typprüfen, wie JSON.stringify(BigInt(1))TypeError, oder JSON.parse(Symbol())TypeError (Symbols können nicht in Strings coerciert werden). Wenn du Parse-Fehler fängst, verfeinere mit err instanceof SyntaxError, um schlechte Daten getrennt von schlechten Argumenten zu behandeln.

So behebst du es —— Schritt für Schritt

  1. Logge das Input:console.log(typeof src, src) direkt vor dem Parse. Wenn es undefined ausgibt, ist das der Übeltäter.
  2. Verfolge, wo es gesetzt werden sollte —— ein nicht initialisiertes State-Feld, ein fehlendes Argument oder eine Property, die nicht auf dem Objekt existiert.
  3. Füge einen Guard hinzu (if (src)) oder einen safeParse-Fallback, damit ein fehlender Wert nicht zu JSON.parse() gelangt.
  4. Falls es async ist, stelle sicher, dass du den Wert vor dem Parsen mit await holst.

Häufig gestellte Fragen

Was bedeutet „Unexpected token u in JSON at position 0"?

Du hast undefined an JSON.parse() übergeben. Es wird zum String "undefined", und das führende u ist kein gültiges JSON-Startzeichen.

Ist das dasselbe wie der „token o"- oder „token <"-Fehler?

Gleiche Familie, anderer Wert. u = undefined; token o = ein Objekt, das zu [object Object] stringifiziert wurde; token < = eine HTML-Antwort. Das genannte Zeichen sagt dir, was tatsächlich übergeben wurde.

Warum wirft JSON.parse(null) nicht denselben Fehler?

"null" ist gültiges JSON, also gibt JSON.parse(null) null zurück. Nur undefined (→ "undefined") löst den u-Fehler aus.

Jetzt beheben