Errori JSON, spiegati
Ogni pagina qui prende un messaggio d’errore esatto e risponde a tre domande: di che cosa si stesse lamentando davvero il parser, che cosa lo provoca nel codice reale in ordine di frequenza, e che cosa cambiare. Ciascuna incorpora il validatore, così puoi sistemare il tuo payload senza lasciare la pagina.
I messaggi sono misurati, non ricordati. Ogni stringa V8 e Python di questo sito viene dall’esecuzione del parser. Le stringhe di Firefox e Safari sono deliberatamente assenti, perché non abbiamo potuto eseguirle e verificarle, e pubblicare una congettura su un messaggio d’errore, su un sito il cui argomento intero è la correttezza, sarebbe un pessimo affare.
Oppure incolla e basta il payload
Nulla di ciò che incolli lascia il tuo browser. L’allowlist connect-src ne fa una garanzia del browser anziché una promessa. Verificalo tu stesso
JavaScript, Node e Chrome
Misurato su Node v24.15.0 con V8 13.6.233.17. V8 ha riscritto quasi tutti questi messaggi nel 2022, quindi ogni pagina porta sia la formulazione attuale sia quella che troverai nelle risposte più vecchie.
-
Unexpected token '<', "<!DOCTYPE "... is not valid JSONIl server ha restituito una pagina di errore , e altre 4 cause. -
Unexpected end of JSON inputLa stringa è vuota , e altre 4 cause. -
"[object Object]" is not valid JSONIl valore era già stato analizzato , e altre 2 cause. -
"undefined" is not valid JSONUna chiave di storage mai impostata , e altre 2 cause. -
Unexpected non-whitespace character after JSON at position N (line L column C)L’input è NDJSON o JSON Lines , e altre 3 cause. -
Bad control character in string literal in JSON at position N (line L column C)Testo su più righe incollato direttamente dentro una stringa , e altre 3 cause. -
Bad escaped character in JSON at position N (line L column C)Un percorso di file Windows con backslash singoli , e altre 3 cause. -
Expected double-quoted property name in JSON at position N (line L column C)Una virgola finale prima della graffa di chiusura , e altre 2 cause. -
Expected property name or '}' in JSON at position N (line L column C)Chiavi tra apici singoli, da un dict Python stampato con str() , e altre 3 cause. -
Expected ',' or '}' after property value in JSON at position N (line L column C)Una virgola mancante tra le proprietà , e altre 3 cause. -
Unterminated string in JSON at position N (line L column C)Una virgoletta doppia senza escape dentro il valore , e altre 3 cause.
Python
Misurato su CPython 3.14.3. Due di questi messaggi sono nuovi in Python 3.13, quindi la versione conta e ogni pagina dice quale.
-
Expecting value: line 1 column 1 (char 0)Il corpo della risposta è HTML, non JSON , e altre 3 cause. -
Extra data: line L column C (char N)Il file è JSON Lines , e altre 2 cause. -
Expecting ',' delimiter: line L column C (char N)Una virgoletta doppia senza escape dentro una stringa , e altre 3 cause. -
Expecting property name enclosed in double quotes: line L column C (char N)Un dict Python stampato anziché serializzato , e altre 2 cause. -
Invalid control character at: line L column C (char N)Testo su più righe dentro una stringa , e altre 2 cause. -
Invalid \escape: line L column C (char N)Un percorso Windows , e altre 2 cause. -
Unterminated string starting at: line L column C (char N)Una virgoletta senza escape dentro il valore , e altre 2 cause.
PHP
PHP fallisce in silenzio per impostazione predefinita, ed è questo il vero problema. La pagina spiega come cavargli un messaggio vero.
C# e .NET
Newtonsoft.Json e System.Text.Json formulano lo stesso fallimento in modo diverso.
Java
Jackson, cioè quello che quasi tutto l’ecosistema JVM usa sotto.
I quattro errori dietro quasi tutti questi
Togli la formulazione e quasi ogni messaggio di questa pagina viene da una di quattro cose.
- Non è affatto JSON
- Una pagina d’errore HTML, un corpo vuoto, un messaggio in testo semplice. Il parser ha ragione ed è la richiesta a essere sbagliata. Controlla il codice di stato e il Content-Type prima del corpo.
- È JavaScript o Python, non JSON
- Apici singoli, chiavi senza virgolette, virgole finali, True e None. Quasi sempre un dict o un letterale di oggetto stampato anziché serializzato. La riparazione sistema tutto.
- Una stringa è stata costruita per concatenazione
- Il che significa che i valori non hanno mai subito escape, quindi una virgoletta o un a capo dentro uno di essi rompe il documento. Serializzare invece rende impossibile questa classe di bug.
- Sono più documenti, non uno
- NDJSON letto come un valore unico. Leggilo riga per riga oppure avvolgi i record in un array.