← Tous les articles

Caractère mal échappé en JSON : échappements valides et correctifs

Un caractère mal échappé en JSON signifie qu'une barre oblique inverse est suivie d'un caractère que JSON n'autorise pas. Voir la liste complète des échappements valides, plus les correctifs pour \x, les chemins et \u.

SyntaxError: Bad escaped character in JSON at position N signifie qu’il y a un antislash (\) à l’intérieur d’une chaîne suivi de quelque chose que JSON ne reconnaît pas comme un échappement valide. JSON n’autorise qu’un petit ensemble figé de séquences d’échappement —— tout le reste après un \ déclenche cette erreur. Voici la liste complète et comment corriger.

Quelle erreur de chaîne est-ce que je vois ?

  • Bad escaped character —— un \ est suivi de quelque chose que JSON n’autorise pas (par ex. \x, chemins Windows).
  • Bad control character —— une tabulation/un retour à la ligne/un octet null brut se trouve à l’intérieur d’une chaîne, sans échappement.
  • Unterminated string —— une chaîne a été ouverte avec " mais jamais refermée.

À quoi ressemble l’erreur

// V8 (Chrome / Node / Edge)
SyntaxError: Bad escaped character in JSON at position 14

// Firefox
SyntaxError: JSON.parse: bad escaped character at line 1 column 15 of the JSON data

// Safari
SyntaxError: JSON Parse error: Invalid escape character \x

Les seuls échappements que JSON autorise

À l’intérieur d’une chaîne JSON, un antislash ne peut être suivi que d’exactement l’un de ceux-ci :

\"   guillemet double
\\   antislash
\/   slash
\b   retour arrière
\f   form feed
\n   saut de ligne
\r   retour chariot
\t   tabulation
\uXXXX   un point de code Unicode (exactement 4 chiffres hex)

Tout le reste après un \ —— \x, \', \a, \0, un chemin Windows comme \Users, ou un \u12 mal formé —— compte comme un « bad escaped character ».

Pourquoi ça arrive

Cause 1 —— Échappements empruntés à d’autres langages

// ❌ \x et \' sont valides en JS/Python, pas en JSON
{ "code": "\x1b[0m", "name": "O\'Brien" }

// ✅ utiliser un échappement \u pour l’octet, ne pas échapper les apostrophes
{ "code": "\u001b[0m", "name": "O'Brien" }

Cause 2 —— Chemins de fichiers Windows

// ❌ chaque antislash ouvre un échappement invalide
{ "path": "C:\Users\Ada\file.json" }

// ✅ échapper chaque antislash (ou utiliser des slashes)
{ "path": "C:\\Users\\Ada\\file.json" }
{ "path": "C:/Users/Ada/file.json" }

Cause 3 —— Échappement \u tronqué ou mal formé

// ❌ \u demande exactement 4 chiffres hex
{ "char": "\u12" }

// ✅
{ "char": "\u0012" }

Paires de substitution et caractères hors BMP

L’échappement \uXXXX de JSON est figé à 4 chiffres hex, ce qui adresse les points de code jusqu’à U+FFFF (le Plan Multilingue de Base). Les caractères au-dessus —— emojis, beaucoup d’extensions CJK, symboles mathématiques —— doivent s’écrire sous forme de paire de substitution UTF-16 :

// 😀 (U+1F600) en paire de substitution
"\uD83D\uDE00"

// non autorisé —— JSON n’a pas de \U ni de \u{...}
"\u1F600"     // mauvais échappement (seuls les 4 premiers hex sont consommés ; le reste est du texte)
"\u{1F600}"   // mauvais échappement

C’est l’encodage de JSON sous forme UTF-16, même si le fichier sur disque est en UTF-8. Deux conséquences pratiques :

  • UTF-8 dans le fichier est très bien. Vous pouvez écrire "😀" littéralement ; les parsers modernes le gèrent. La forme en paire de substitution n’est nécessaire que lorsque vous devez échapper.
  • Attention aux substituts orphelins. Un \uD83D sans son substitut bas correspondant, ou l’inverse, est techniquement autorisé par JSON mais constitue de l’UTF-16 mal formé —— les consommateurs en aval (en particulier jsonb de Postgres) le rejetteront. JSON.stringify ne produit que des paires bien formées.

Comment corriger —— étape par étape

  1. Sauter à la position signalée et trouver le \ qui précède un caractère invalide.
  2. Antislash isolé ? (par ex. un chemin Windows) —— doublez-le en \\, ou passez aux slashes.
  3. Échappement étranger comme \x ou \' ? —— convertissez \xNN en \u00NN et retirez l’antislash devant '.
  4. Un \u trop court ? —— remplissez à exactement quatre chiffres hex.
  5. Meilleure correction : construisez le JSON avec JSON.stringify(), qui ne produit que des échappements valides.
// Prévention —— l’échappement correct est automatique
JSON.stringify({ path: 'C:\\Users\\Ada', code: '\x1b[0m' });
// → {"path":"C:\\Users\\Ada","code":"\u001b[0m"}

Questions fréquentes

Que signifie « Bad escaped character in JSON » ?

Un antislash à l’intérieur d’une chaîne est suivi d’un caractère qui ne fait pas partie des échappements autorisés par JSON (" \\ / b f n r t ou \uXXXX). Les coupables habituels sont \x, \', et les chemins Windows non échappés.

Comment mettre un chemin Windows dans du JSON ?

Doublez chaque antislash (C:\\\\Users) pour que chacun forme un échappement \\ valide, ou utilisez des slashes (C:/Users), que JSON accepte.

Est-ce la même chose que « Bad control character » ?

Non. « Bad escaped character » parle d’une séquence invalide après un antislash ; « bad control character » parle d’un octet de contrôle brut et non échappé (tabulation, saut de ligne) sans aucun antislash.

Corriger maintenant