Bad control character in string literal in JSON at position N (line L column C)
Una stringa del tuo documento contiene un carattere di controllo letterale: quasi sempre un vero a capo, a volte una tabulazione. Le stringhe JSON non possono contenere caratteri sotto U+0020 senza escape. Un a capo va scritto come \n, una tabulazione come \t. La posizione indica il carattere incriminato.
Incolla il tuo JSON e vedi esattamente dove si rompe
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
Che cosa lo provoca davvero
In ordine di quanto spesso ciascuno si rivela essere la risposta.
-
01 Testo su più righe incollato direttamente dentro una stringa
SQL, HTML, un estratto di log o un messaggio di errore con veri a capo dentro. Per il parser, l’a capo chiude la stringa.
Si rompe
{ "query": "SELECT * FROM users" }Funziona
{ "query": "SELECT *\nFROM users" } -
02 JSON costruito concatenando stringhe
È la causa profonda di quasi ogni caso. Il JSON assemblato a mano non esegue l’escape dei valori che ci interpoli dentro. Serializza invece l’oggetto e il problema non può proprio verificarsi.
Si rompe
const body = '{"note": "' + note + '"}';Funziona
const body = JSON.stringify({ note }); -
03 Una tabulazione arrivata con un copia e incolla
Le tabulazioni sono invisibili e finiscono facilmente dentro le stringhe quando si copia da un foglio di calcolo o da un terminale. Escapale come \t, oppure toglile prima di costruire il documento.
-
04 Fine riga di Windows dentro un valore
Anche il ritorno a capo, U+000D, è un carattere di controllo. Testo letto da un file Windows e incorporato in una stringa si porta dietro \r oltre a \n.
Lo stesso errore in altri runtime
Il problema di fondo è identico; cambia solo la formulazione. Se un collega segnala uno di questi messaggi, sta guardando esattamente la stessa cosa che vedi tu.
| Python | Invalid control character at: line 1 column 8 (char 7) |
|---|---|
| Java (Jackson) | Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value |
Domande frequenti
- Quali caratteri vanno escapati?
- Tutto da U+0000 a U+001F, più la virgoletta doppia e il backslash. JSON definisce escape brevi per backspace, salto pagina, a capo, ritorno a capo e tabulazione; tutto il resto in quell’intervallo richiede la forma \u, per esempio \u0000.
- Posso far accettare quei caratteri al parser?
- Jackson ha ALLOW_UNESCAPED_CONTROL_CHARS e alcuni parser hanno interruttori simili, ma questo nasconde il problema anziché risolverlo, e il documento resta non valido per ogni altro consumatore. Fai l’escape nel punto in cui il JSON viene prodotto.
Risolvilo adesso
Incolla il payload nello strumento qui sopra, oppure vai direttamente a quello creato per questo compito.
Riparalo automaticamente