← Tutti gli articoli

Carattere non-whitespace inatteso dopo i dati JSON: correzioni

Questo errore significa che c'è contenuto extra dopo un valore JSON completo — oggetti concatenati, NDJSON parsato come singolo blocco o spazzatura finale. Come trovare e rimuovere i dati in eccesso.

SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data significa che il parser ha letto con successo un valore JSON completo —— e poi ha trovato altro contenuto non-whitespace dopo. JSON ammette esattamente un valore di primo livello, quindi tutto ciò che viene dopo è un errore. Ecco da dove arrivano gli „extra data“ e come correggerli.

Com'è fatto l'errore

// 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   // formulazione più vecchia

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

La posizione punta al primo carattere dopo il valore valido —— è lì che inizia „l'extra“.

Perché succede

Causa 1 —— Due valori JSON concatenati

// ❌ due oggetti schiena contro schiena —— valore valido, poi altro
{"id":1}{"id":2}
//      ^ posizione 8: non-whitespace dopo JSON

// ✅ avvolgili in un array
[{"id":1},{"id":2}]

Causa 2 —— NDJSON / JSON Lines parsato come unico blob

I file di log e le API in streaming spesso emettono un oggetto JSON per riga (NDJSON). JSON.parse() legge solo il valore della prima riga e poi inciampa sulla successiva.

// ❌ JSON.parse sull'intero file
{"event":"login"}
{"event":"logout"}

// ✅ parsa riga per riga
const rows = text
  .split('\n')
  .filter(Boolean)
  .map((line) => JSON.parse(line));

Causa 3 —— Spazzatura in coda o risposta duplicata

// ❌ testo vagante, payload duplicato o punto e virgola in coda
{"ok":true};
{"ok":true}  // riga di debug aggiunta da un proxy
extra

JSON-RPC e altri stream con framing

Se stai consumando un protocollo —— JSON-RPC su stdio, il Language Server Protocol (LSP), il Debug Adapter Protocol —— più messaggi JSON viaggiano su un solo canale per design. Ciascuno porta un livello di framing che dice quanto è lungo il prossimo, proprio per evitare di provare a parsare due valori in un solo buffer:

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":{...}}

La regola: leggi l'header Content-Length, leggi esattamente quei byte, parsa un valore JSON, e cicla. Se inghiotti tutto il canale e parsi una volta sola, sbatti contro „unexpected non-whitespace character after JSON data“, perché dentro ci sono tanti valori.

Per NDJSON la regola equivalente è „split su \n, parsa ogni riga“. Il filo comune: uno stream di messaggi JSON ha sempre bisogno di un livello di framing; la concatenazione cruda non è JSON valido.

Come correggere —— passo a passo

  1. Vai alla posizione segnalata —— tutto da lì in poi è „l'extra“. Guarda cosa segue subito il primo valore completo.
  2. Più valori? Se intendevi una lista, avvolgili in un array [ … ] separati da virgole.
  3. NDJSON / JSON Lines? Split sui ritorni a capo e parsa ogni riga separatamente —— non parsare l'intero file tutto in una volta.
  4. Spazzatura in coda? Taglia i caratteri vaganti (punto e virgola, payload duplicato, output di debug) prima del parsing.
  5. Streaming? Verifica di non stare concatenando più risposte in un solo buffer prima del parsing.

Domande frequenti

Cosa significa „unexpected non-whitespace character after JSON data“?

Il parser ha letto un valore JSON valido e poi ha trovato altro contenuto. JSON ammette un solo valore di primo livello, quindi i caratteri successivi sono non validi.

Come parso più oggetti JSON?

Se sono concatenati, avvolgili in un array. Se è uno per riga (NDJSON / JSON Lines), splitta sul ritorno a capo e JSON.parse() ogni riga singolarmente.

È la stessa cosa di „Unexpected end of JSON input“?

Sono opposti. Questo errore significa che ci sono troppi dati (in più dopo un valore completo); „Unexpected end of JSON input“ significa che ce ne sono troppo pochi (il valore è troncato).

Correggi ora