← Alle Artikel

Unerwartetes Nicht-Whitespace-Zeichen nach JSON-Daten: Fixes

Dieser Fehler heißt: nach einem vollständigen JSON-Wert kommt zusätzlicher Inhalt — verkettete Objekte, NDJSON als ein Block geparst oder Müll am Ende. Wie du die Extra-Daten findest und entfernst.

SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data bedeutet, dass der Parser erfolgreich einen vollständigen JSON-Wert gelesen hat —— und danach noch mehr Nicht-Whitespace-Inhalt fand. JSON erlaubt genau einen Top-Level-Wert, also ist alles Nachfolgende ein Fehler. Hier ist, was die „extra data“ verursacht und wie man sie behebt.

Wie der Fehler aussieht

// Firefox
SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data
  at line 1 column 18 of the JSON data

// V8 (Chrome / Node / Edge)
SyntaxError: Unexpected non-whitespace character after JSON at position 17
SyntaxError: Unexpected token { in JSON at position 17   // ältere Formulierung

// Python (analog)
json.decoder.JSONDecodeError: Extra data: line 1 column 18 (char 17)

Die Position zeigt auf das erste Zeichen nach dem gültigen Wert —— dort beginnt „das Extra“.

Warum es passiert

Ursache 1 —— Zwei JSON-Werte aneinandergehängt

// ❌ zwei Objekte Rücken an Rücken —— gültiger Wert, dann noch mehr
{"id":1}{"id":2}
//      ^ Position 8: Nicht-Whitespace nach JSON-Daten

// ✅ in einem Array zusammenfassen
[{"id":1},{"id":2}]

Ursache 2 —— NDJSON / JSON Lines als ein Block geparst

Logdateien und Streaming-APIs geben oft ein JSON-Objekt pro Zeile aus (NDJSON). JSON.parse() liest nur den Wert der ersten Zeile und stolpert über die nächste.

// ❌ JSON.parse auf die gesamte Datei
{"event":"login"}
{"event":"logout"}

// ✅ Zeile für Zeile parsen
const rows = text
  .split('\n')
  .filter(Boolean)
  .map((line) => JSON.parse(line));

Ursache 3 —— Müll am Ende oder verdoppelte Antwort

// ❌ verirrter Text, doppelter Payload oder Strichpunkt am Ende
{"ok":true};
{"ok":true}  // Debug-Zeile, angehängt von einem Proxy
extra

JSON-RPC und andere geframte Streams

Wenn Sie ein Protokoll konsumieren —— JSON-RPC über stdio, das Language Server Protocol (LSP), das Debug Adapter Protocol —— fließen mehrere JSON-Nachrichten by design über einen Kanal. Jede trägt eine Framing-Schicht, die angibt, wie lang die nächste Nachricht ist, gerade damit Sie nicht versuchen, zwei Werte in einem Puffer zu parsen:

Content-Length: 87\r\n
\r\n
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{...}}Content-Length: 42\r\n
\r\n
{"jsonrpc":"2.0","id":1,"result":{...}}

Die Regel: lesen Sie den Content-Length-Header, lesen Sie genau so viele Bytes, parsen Sie einen JSON-Wert, schleifen Sie. Wenn Sie den ganzen Kanal aufsaugen und einmal parsen, treffen Sie „unexpected non-whitespace character after JSON data“, weil drin viele Werte stehen.

Für NDJSON lautet die entsprechende Regel „auf \n splitten, jede Zeile parsen.“ Der gemeinsame Faden: ein Strom von JSON-Nachrichten braucht immer eine Framing-Schicht; reine Konkatenation ist kein legales JSON.

Wie man es behebt —— Schritt für Schritt

  1. Springen Sie zur gemeldeten Position —— alles ab dort ist „das Extra“. Sehen Sie sich an, was direkt nach dem ersten vollständigen Wert kommt.
  2. Mehrere Werte? Wenn Sie eine Liste meinten, wickeln Sie sie in ein [ … ]-Array, getrennt durch Kommas.
  3. NDJSON / JSON Lines? Auf Zeilenumbruch splitten und jede Zeile separat parsen —— die ganze Datei nicht auf einmal parsen.
  4. Müll am Ende? Schneiden Sie die störenden Zeichen (Strichpunkt, duplizierter Payload, Debug-Ausgabe) vor dem Parsen ab.
  5. Streaming? Stellen Sie sicher, dass Sie nicht mehrere Antworten in einem Puffer konkatenieren, bevor Sie parsen.

Häufig gestellte Fragen

Was bedeutet „unexpected non-whitespace character after JSON data“?

Der Parser hat einen gültigen JSON-Wert gelesen und danach mehr Inhalt gefunden. JSON erlaubt nur einen einzigen Top-Level-Wert, daher sind die nachfolgenden Zeichen ungültig.

Wie parse ich mehrere JSON-Objekte?

Wenn sie verkettet sind, wickeln Sie sie in ein Array. Wenn es eines pro Zeile (NDJSON / JSON Lines) ist, splitten Sie auf dem Zeilenumbruch und JSON.parse() jede Zeile einzeln.

Ist das dasselbe wie „Unexpected end of JSON input“?

Sie sind Gegensätze. Dieser Fehler heißt, es gibt zu viele Daten (mehr nach einem vollständigen Wert); „Unexpected end of JSON input“ heißt, es gibt zu wenige (der Wert wurde abgeschnitten).

Jetzt beheben