Bad control character in string literal in JSON at position N (line L column C)
Une chaîne de votre document contient un caractère de contrôle littéral : le plus souvent un vrai saut de ligne, parfois une tabulation. Les chaînes JSON ne peuvent pas contenir de caractères sous U+0020 sans échappement. Un saut de ligne doit s’écrire \n, une tabulation \t. La position désigne le caractère fautif.
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 collé directement dans une chaîne
Du SQL, du HTML, un extrait de journal ou un message d’erreur contenant de vrais sauts de ligne. Pour l’analyseur, le saut de ligne met fin à la chaîne.
Casse
{ "query": "SELECT * FROM users" }Fonctionne
{ "query": "SELECT *\nFROM users" } -
02 Du JSON construit par concaténation de chaînes
C’est la cause profonde de presque tous les cas. Le JSON assemblé à la main n’échappe pas les valeurs que vous y interpolez. Sérialisez plutôt l’objet et le problème ne peut plus se produire.
Casse
const body = '{"note": "' + note + '"}';Fonctionne
const body = JSON.stringify({ note }); -
03 Une tabulation venue d’un copier-coller
Les tabulations sont invisibles et se glissent facilement dans les chaînes quand on copie depuis un tableur ou un terminal. Échappez-les en \t, ou retirez-les avant de construire le document.
-
04 Des fins de ligne Windows à l’intérieur d’une valeur
Un retour chariot, U+000D, est lui aussi un caractère de contrôle. Du texte lu depuis un fichier Windows et intégré dans une chaîne transporte \r en plus de \n.
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.
| 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 |
Questions fréquentes
- Quels caractères doivent être échappés ?
- Tout ce qui va de U+0000 à U+001F, plus le guillemet double et l’antislash. JSON définit des échappements courts pour le retour arrière, le saut de page, le saut de ligne, le retour chariot et la tabulation ; tout le reste de cette plage exige la forme \u, par exemple \u0000.
- Puis-je faire accepter ces caractères par l’analyseur ?
- Jackson dispose de ALLOW_UNESCAPED_CONTROL_CHARS et certains analyseurs ont des options similaires, mais cela masque le problème au lieu de le corriger, et le document reste invalide pour tous les autres consommateurs. Échappez à l’endroit où le JSON est produit.
Corrigez-le maintenant
Collez le payload dans l’outil ci-dessus, ou allez directement à celui conçu pour ce travail.
Le réparer automatiquement