Illegal unquoted character ((CTRL-CHAR, code 10))
Una stringa del documento contiene un carattere di controllo letterale. Il codice 10 è un a capo, il 13 un ritorno a capo, il 9 una tabulazione. JSON richiede che abbiano l’escape, e Jackson fa bene a rifiutarli. È lo stesso problema di fondo che V8 chiama «bad control character».
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 incorporato in una stringa
SQL, stack trace, righe di log e contenuti da template contengono tutti veri a capo.
Si rompe
{ "query": "SELECT * FROM users" }Funziona
{ "query": "SELECT *\nFROM users" } -
02 JSON costruito per concatenazione
I valori interpolati non ricevono l’escape. Serializza con ObjectMapper.writeValueAsString invece di assemblare il testo a mano.
Si rompe
String body = "{\"note\": \"" + note + "\"}";Funziona
String body = mapper.writeValueAsString(Map.of("note", note)); -
03 Fine riga di Windows dentro un valore
Il ritorno a capo, codice 13, è un carattere di controllo a sé e richiede \r.
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.
| JavaScript (V8) | Bad control character in string literal in JSON at position 11 (line 1 column 12) |
|---|---|
| Python | Invalid control character at: line 1 column 8 (char 7) |
Domande frequenti
- E ALLOW_UNESCAPED_CONTROL_CHARS?
- JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS fa sì che Jackson li accetti, ed è un rimedio ragionevole quando non puoi modificare chi produce il JSON. Non rende però il documento JSON valido, quindi qualunque altro consumatore continuerà a fallire.
Risolvilo adesso
Incolla il payload nello strumento qui sopra, oppure vai direttamente a quello creato per questo compito.
Esegui l’escape del valore