Aiuto tecnico

Perché JSON.parse dice "Unexpected token"?

JSON.parse lancia Unexpected token quando il testo non è JSON valido. Analizza virgolette semplici, virgola finale, risposte HTML e la posizione dell’errore.

Risposta rapida

JSON.parse() lancia un SyntaxError quando l’input non è JSON valido. “Unexpected token” di solito significa che il parser ha raggiunto un carattere non consentito in quel punto della struttura.

Cause comuni: virgolette semplici, virgola finale, nomi di proprietà senza virgolette, escape di stringa errato, testo extra intorno al JSON, oppure analizzare HTML o un altro body non JSON come se fosse JSON.

Il testo esatto dell’errore varia in base al motore JavaScript e al browser. Non dare per scontato che ogni runtime stampi “Unexpected token X in JSON at position N”.

Questa è la diagnosi di Unexpected token in JSON.parse: cosa significa l’errore, come leggere la posizione e cosa fare quando il body è HTML. Virgola finale, virgolette e Unexpected end sono trattati più ampiamente in Errori JSON comuni: virgola finale, virgolette e Unexpected token.

Cosa significa “Unexpected token” in JSON.parse()?

JSON.parse() richiede la grammatica JSON. Un carattere illegale nella posizione corrente lancia SyntaxError. {“name”:“Alex”,} è invalido: dopo quella virgola l’oggetto non può chiudersi. Il testo del messaggio e la posizione variano ancora a seconda del runtime.

Quale errore lancia JSON.parse()?

JSON non valido in genere lancia SyntaxError. Registra error.name per confermare il tipo. Non fissare l’intero error.message: motori e versioni lo formulano in modo diverso.

try {
  JSON.parse('{"name":"Alex",}');
} catch (error) {
  console.log(error.name);
  // SyntaxError
}

1. Usare virgolette semplici al posto delle doppie

{‘name’:‘Alex’} è JSON non valido. {“name”:“Alex”} è valido. Le stringhe JSON e i nomi dei membri di oggetto usano virgolette doppie. Un letterale oggetto JavaScript come const user = { name: ‘Alex’ } può essere JavaScript legale e comunque non essere testo JSON.

Non valido

{'name':'Alex'}

Valido

{"name":"Alex"}

2. Virgola finale

Una virgola dopo l’ultima proprietà o l’ultimo elemento di array non è JSON standard valido. {“name”:“Alex”,“age”:30,} e [1, 2, 3,] falliscono entrambi. Trattalo come una causa di Unexpected token; Errori JSON comuni: virgola finale, virgolette e Unexpected token approfondisce la virgola finale.

Non valido

{
  "name": "Alex",
  "age": 30,
}

Valido

{
  "name": "Alex",
  "age": 30
}
[1, 2, 3,]

3. Nomi di proprietà senza virgolette

{ name: “Alex” } può essere un letterale oggetto JavaScript. In JSON i nomi dei membri sono stringhe e servono virgolette doppie: {“name”:“Alex”}.

Non valido

{
  name: "Alex"
}

Valido

{
  "name": "Alex"
}

4. Escape di stringa non valido

Nel testo JSON una barra rovesciata avvia un escape. Un percorso grezzo come C:\Users\Alex è invalido perché \U non è un escape legale. Raddoppia le barre rovesciate. Non mescolare l’escape del linguaggio ospite con l’escape JSON. Errori JSON comuni: virgola finale, virgolette e Unexpected token lo approfondisce.

Non valido

{"file":"C:\Users\Alex"}

Valido

{"file":"C:\\Users\\Alex"}

5. Testo extra prima o dopo il JSON

JSON.parse si aspetta un solo valore JSON. Un prefisso come Success: prima di {“ok”:true}, o un suffisso come done dopo, rende invalida l’intera stringa. Lo spazio bianco insignificante intorno a un singolo valore JSON è consentito. JSON non vieta gli spazi prima o dopo il valore.

Success:
{"ok":true}
{"ok":true}
done

6. Analizzare HTML invece di JSON

Chiamare response.json() su una pagina HTML è un caso comune di Unexpected token. Endpoint sbagliati, pagine HTML 404 o 500, redirect di login, body di proxy e pagine di fallback spesso iniziano con markup. “Unexpected token < always means HTML” è troppo forte: < è un indizio, non una prova.

fetch('/api/data')
  .then(response => response.json())

Cosa significa di solito “Unexpected token <”?

I valori JSON di norma non iniziano con <. Se il body inizia con o , < può essere il primo carattere illegale. In debug locale, controlla lo stato HTTP, Content-Type e il body grezzo. La formulazione del motore continua a variare.

Controlla la risposta prima di analizzarla

Il body di fetch si può consumare una sola volta. In debug locale, leggi prima text(), ispeziona un prefisso breve, poi fai JSON.parse su quella stessa stringa. Non chiamare response.json() e poi response.text() sulla stessa risposta. Non registrare di default payload di produzione sensibili.

const response = await fetch(url);
const text = await response.text();

console.log(response.status);
console.log(response.headers.get("content-type"));
console.log(text.slice(0, 200));

try {
  const data = JSON.parse(text);
  console.log(data);
} catch (error) {
  console.error("Invalid JSON:", error);
}

Cosa significa “at position 123”?

Alcuni motori riportano una posizione, riga o colonna. Cerca vicino una virgoletta, virgola, graffa o escape sbagliati. Quell’indice è dove l’analisi ha notato un problema; la causa vera può essere prima. Non è garantito che sia il carattere difettoso esatto.

Unexpected token rispetto a Unexpected end

Unexpected token significa che il parser ha incontrato un carattere che non si aspettava. Unexpected end può comparire quando l’input si ferma prima che il valore sia completo, come in {“name”:“Alex” senza graffa di chiusura. La formulazione esatta dipende dal motore. Errori JSON comuni: virgola finale, virgolette e Unexpected token copre il JSON incompleto in modo più ampio.

{"name":"Alex"

JSON non è lo stesso di un letterale oggetto JavaScript

JSON è un formato dati. Un letterale oggetto JavaScript è sintassi JavaScript. L’oggetto JS con chiavi senza virgolette, virgolette semplici e una virgola finale non è testo JSON valido. JSON.parse non può analizzare in modo sicuro i letterali oggetto JavaScript.

const data = {
  name: 'Alex',
  active: true,
};
{
  "name": "Alex",
  "active": true
}

JSON può contenere commenti?

Il JSON standard non supporta i commenti. Una riga // dentro un oggetto è invalida. JSON5 e estensioni simili sono formati diversi. Formattare e confrontare JSON valida JSON standard con JSON.parse e non tratta JSON5 come JSON.

{
  // user name
  "name": "Alex"
}

undefined, NaN e Infinity sono JSON valido?

No. I valori JSON sono oggetto, array, stringa, numero, true, false e null. undefined, NaN e Infinity non lo sono. Un valore di primo livello non deve essere un oggetto o un array: true, 123, “hello” e null sono JSON valido.

{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null

Come correggere un errore Unexpected token passo dopo passo

Lavora sulla fonte, non sulla stringa dell’errore:

  1. Conferma che l’input sia davvero JSON, non HTML, log o JavaScript.
  2. Ispeziona i primi caratteri dell’input grezzo.
  3. Se proviene da un’API, controlla lo stato HTTP e Content-Type. Né 200 né application/json garantiscono JSON valido.
  4. Valida la sintassi in un parser JSON.
  5. Usa qualsiasi posizione, riga o colonna segnalata come indizio, non come causa radice garantita.
  6. Controlla virgolette, virgole, graffe, parentesi quadre ed escape vicino a quell’area.
  7. Confronta con una copia formattata e validata.
  8. Correggi il serializzatore o l’endpoint. Non cancellare a caso il token segnalato.
Non “aggiustare” il JSON sostituendo le virgolette a caso

Una sostituzione globale di ' con " può rompere apostrofi dentro le stringhe, testo già sottoposto a escape e fonti non JSON. Produci JSON valido dal serializzatore reale. Non trattare eval come un parser JSON.

Usa JSON.stringify() quando produci JSON in JavaScript

Preferisci JSON.stringify alla concatenazione manuale di stringhe. Emette testo JSON valido per i valori che serializza. Non conserva ogni valore JavaScript: undefined, funzioni e simboli hanno un comportamento speciale. Quel dettaglio è fuori ambito qui.

const data = {
  name: "Alex",
  active: true
};
const json = JSON.stringify(data);
// {"name":"Alex","active":true}

JSON non valido rispetto a una correzione reale

Queste coppie sono state verificate con JSON.parse. Per l’HTML, la correzione è la risposta, non una modifica di sintassi.

Problema Non valido Correzione
Virgolette semplici {'a':1} {"a":1}
Virgola finale {"a":1,} {"a":1}
Chiave senza virgolette {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
Body HTML <html>... Controlla l’endpoint e la risposta grezza. Non modificare l’HTML per trasformarlo in JSON.

Una guida decisionale semplice per Unexpected token

Se JSON.parse è fallito, decidi se hai davvero JSON prima di riscrivere le virgolette.

  • JSON.parse è fallito
  • Da un’API? Controlla stato, Content-Type e il body grezzo
  • Inizia come JSON? Se no, correggi la fonte o l’endpoint
  • Se sì, valida virgolette, virgole, graffe, parentesi, escape, valori non supportati
  • Usa la posizione segnalata come indizio
  • Correggi la fonte, poi analizza di nuovo
Unexpected token dà un nome alla sorpresa. La fonte del testo è spesso la vera correzione.

Valida il JSON prima di analizzarlo o usarlo

NEXNARA Formattare e confrontare JSON valida JSON nel browser con JSON.parse—non eval.

Valida, formatta con 2 spazi, 4 spazi o tabulazioni, minimizza, copia, scarica e carica .json. JSON Diff copre oggetti e array nidificati, percorsi, riepilogo, filtri e scambio. Dopo il parse, le copie formattata e minimizzata degli stessi dati si confrontano come uguali; le chiavi oggetto si confrontano per nome.

Testo più grande di 5 MB può sembrare lento. Testo più grande di 15 MB non viene elaborato nel browser.

Validazione e formattazione JSON avvengono nel tuo browser. Questo strumento non invia il JSON a un server NEXNARA. Annunci e altre funzioni del sito usano comunque la rete.

Incolla la stringa che fallisce in Formattare e confrontare JSON e leggi i primi caratteri prima di riscrivere le virgolette.

FAQ

Perché JSON.parse dice Unexpected token?

Il testo non è JSON valido nel punto in cui il parser si è fermato. Cause tipiche: virgolette, virgole, testo extra o un body non JSON come HTML.

Cosa significa Unexpected token < in JSON?

Il primo carattere illegale può essere <. Spesso indica una pagina HTML, ma non è prova di un 404 né di HTML in ogni caso. Controlla stato, Content-Type e il body grezzo.

Come trovo la posizione dell’errore nel JSON?

Se il motore riporta una posizione, riga o colonna, guarda vicino. L’errore vero può essere prima. Usala come indizio, poi valida.

JSON può usare virgolette semplici?

No. Nel JSON standard stringhe e nomi di membri usano virgolette doppie.

JSON può avere la virgola finale?

No. Il JSON standard non consente una virgola dopo l’ultima proprietà o l’ultimo elemento di array.

Come controllo se una stringa è JSON valido?

Chiama JSON.parse in un try/catch, oppure incolla il testo in Formattare e confrontare JSON. Se l’analisi lancia SyntaxError, la stringa non è JSON valido.