Illegal unquoted character ((CTRL-CHAR, code 10))
Une chaîne du document contient un caractère de contrôle littéral. Le code 10 est un saut de ligne, le 13 un retour chariot, le 9 une tabulation. JSON impose qu’ils soient échappés, et Jackson a raison de les refuser. C’est le même problème de fond que V8 appelle « bad control character ».
Collez votre JSON et voyez exactement où il casse
Rien de ce que vous collez ne quitte votre navigateur. La liste d’autorisation connect-src en fait une garantie du navigateur plutôt qu’une promesse. Vérifiez-le vous-même
Ce qui le provoque réellement
Classés selon la fréquence à laquelle chacun se révèle être la réponse.
-
01 Du texte multiligne intégré dans une chaîne
SQL, traces de pile, lignes de journal et contenu de gabarits comportent tous de vrais sauts de ligne.
Casse
{ "query": "SELECT * FROM users" }Fonctionne
{ "query": "SELECT *\nFROM users" } -
02 Du JSON construit par concaténation
Les valeurs interpolées ne sont pas échappées. Sérialisez avec ObjectMapper.writeValueAsString au lieu d’assembler le texte à la main.
Casse
String body = "{\"note\": \"" + note + "\"}";Fonctionne
String body = mapper.writeValueAsString(Map.of("note", note)); -
03 Des fins de ligne Windows dans une valeur
Le retour chariot, code 13, est un caractère de contrôle distinct et demande \r.
La même erreur dans d’autres environnements
Le problème de fond est identique ; seule la formulation change. Si un collègue signale l’un de ces messages, il regarde exactement la même chose que vous.
| 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) |
Questions fréquentes
- Et ALLOW_UNESCAPED_CONTROL_CHARS ?
- JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS fait accepter ces caractères à Jackson, et c’est un dépannage raisonnable quand vous ne pouvez pas modifier le producteur. Cela ne rend pas le document valide pour autant : tout autre consommateur échouera encore.
Corrigez-le maintenant
Collez le payload dans l’outil ci-dessus, ou allez directement à celui conçu pour ce travail.
Échapper la valeur