Invalid control character at: line L column C (char N)
Une chaîne contient un caractère littéral sous U+0020, en général un vrai saut de ligne ou une tabulation. JSON exige qu’ils soient échappés. Python propose une option strict=False qui les accepte, mais le document obtenu reste invalide pour tous les autres consommateurs.
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 dans une chaîne
Extraits de journaux, SQL, traces de pile et HTML de gabarits comportent tous de vrais sauts de ligne.
Casse
json.loads('{"sql": "SELECT * FROM t"}')Fonctionne
json.loads('{"sql": "SELECT *\\nFROM t"}') -
02 Du JSON assemblé avec des f-strings ou par concaténation
Les valeurs interpolées ne sont pas échappées. Construisez un dict et utilisez json.dumps, qui échappe tout correctement.
Casse
body = f'{{"note": "{note}"}}'Fonctionne
body = json.dumps({"note": note}) -
03 Une tabulation copiée depuis un tableur
Invisible, et elle survit intacte au copier-coller.
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) |
|---|
Questions fréquentes
- Que fait strict=False ?
- json.loads(s, strict=False) autorise les caractères de contrôle dans les chaînes. Cela vous débloque, mais le document reste du JSON invalide : tout ce qui, en aval, n’est pas Python le rejettera encore. Corrigez plutôt le producteur.
Corrigez-le maintenant
Collez le payload dans l’outil ci-dessus, ou allez directement à celui conçu pour ce travail.
Échapper la chaîne correctement