Échappement de chaînes JSON

Échappez du texte pour qu’il soit valide dans une chaîne JSON, ou décodez du texte échappé vers ce qu’il dit vraiment — avec des positions d’erreur exactes.

Texte
Échappé

La sortie apparaîtra ici

Ce que fait cet outil

Une chaîne JSON ne peut pas contenir de guillemet double brut, de barre oblique inverse brute ni de saut de ligne littéral : le format a besoin de ces caractères pour marquer le début et la fin des chaînes. Ils s’écrivent donc sous forme de séquences d’échappement, et cet outil convertit entre les deux formes. Collez du texte ordinaire et obtenez la version échappée, prête à insérer dans du JSON ; changez de sens et le texte échappé redevient lisible.

C’est le second sens qui amène généralement les gens ici : une ligne de journal, un message d’erreur ou une réponse curl arrivée sous forme de mur de barres obliques inverses. Tout s’exécute dans votre navigateur, ce qui compte quand ce que vous essayez de lire est une réponse de production.

Les séquences d’échappement

JSON définit une courte liste d’échappements, et l’outil utilise exactement cette liste — rien de plus exotique, car tout le reste n’est pas du JSON valide.

  • \" — un guillemet double, qui sinon terminerait la chaîne.
  • \\ — une seule barre oblique inverse. C’est pourquoi les chemins Windows et les motifs d’expressions régulières se dédoublent.
  • \n et \r — saut de ligne et retour chariot.
  • \t — tabulation. \b et \f existent aussi, pour retour arrière et saut de page.
  • \/ — un échappement facultatif pour la barre oblique. Valide, jamais obligatoire ; cet outil l’accepte et ne le produit jamais.
  • \uXXXX — n’importe quel caractère par son code hexadécimal, ce qui permet d’écrire les caractères de contrôle et tout ce qui sort de l’ASCII.

Les caractères de contrôle — tout ce qui est en dessous du code 32 — n’ont aucune forme littérale dans une chaîne JSON : ils ressortent donc toujours en échappements \uXXXX, même si vous n’avez pas demandé de sortie ASCII.

Pourquoi les barres obliques inverses se multiplient

La raison la plus courante de recourir à un tel outil est un texte échappé plus d’une fois. Chaque passage de codage échappe les barres obliques inverses introduites par le précédent, si bien qu’un simple guillemet se retrouve avec une traîne de plus en plus longue :

original    He said "hi"
escaped     He said \"hi\"
escaped x2  He said \\\"hi\\\"

Cela arrive quand une valeur est sérialisée en JSON, que ce JSON est stocké comme chaîne dans un autre document JSON, et que le résultat est journalisé. Décoder une fois retire une couche ; relancez sur le résultat jusqu’à ce que le texte se lise normalement. Si vous décodez et qu’il reste des barres obliques inverses, c’est une véritable couche supplémentaire, pas un défaut de la conversion.

Guillemets : valeur ou fragment

Une valeur de chaîne JSON complète comprend les guillemets doubles englobants. Mais la plupart du temps vous collez dans une chaîne qui existe déjà dans votre code ou votre configuration, où ces guillemets seraient de trop. L’échappement produit donc par défaut le seul contenu échappé, et l’option « inclure les guillemets englobants » les ajoute quand vous voulez une valeur à coller entière.

Le décodage n’a besoin d’aucun choix de ce genre : il accepte les deux formes. Collez un fragment ou collez une valeur entièrement entre guillemets sortie d’un document JSON, et les guillemets englobants sont reconnus puis retirés.

Unicode, et quand l’échapper malgré tout

JSON est un format Unicode. « שלום » et « 😀 » sont des chaînes JSON parfaitement valides telles quelles, et les laisser lisibles est le comportement par défaut ici. L’option \uXXXX existe pour les systèmes restés en arrière : anciennes chaînes de traitement de journaux, terminaux et analyseurs qui supposent de l’ASCII et abîment tout le reste.

Un détail compte quand cette option est active. Les caractères hors du plan de base — la plupart des emoji — sont stockés en interne sous forme de deux unités appelées paire de substitution, et le format exige que les deux moitiés soient écrites en échappements distincts. Un emoji devient donc deux échappements \u et non un seul plus long. Les outils qui se trompent là-dessus produisent des échappements qu’aucun analyseur n’accepte : c’est l’explication habituelle des emoji qui survivent à un système et se cassent au suivant.

Quand le décodage échoue

Toutes les séquences commençant par une barre oblique inverse ne sont pas des échappements valides. \q ne signifie rien en JSON, et \u12 est un échappement \u auquel il manque la moitié de ses chiffres. Plutôt que de les laisser passer tels quels et de renvoyer une sortie qui semble correcte sans correspondre à vos données, l’outil s’arrête et signale la ligne et la colonne exactes où commence la séquence fautive.

En pratique cette erreur est instructive : un \q isolé signifie généralement que le texte n’a jamais été échappé pour JSON, et un \u tronqué signifie généralement que l’entrée a été coupée — une ligne de journal rognée par une limite de longueur, ou une copie interrompue au milieu d’une séquence.

Questions fréquentes

Pourquoi mon texte contient-il \\" partout ?
Il a été échappé plus d’une fois. Chaque passage échappe les barres obliques inverses du précédent : un guillemet d’origine peut finir précédé de plusieurs. Décodez plusieurs fois — chaque exécution retire exactement une couche — jusqu’à ce que le texte se lise normalement.
Faut-il activer les guillemets englobants ?
Seulement si vous voulez une valeur JSON complète à coller telle quelle, par exemple comme membre droit entier d’une clé. Si vous collez dans une chaîne déjà présente dans votre code, laissez l’option désactivée, sinon vous obtiendrez des guillemets dans des guillemets.
L’hébreu, l’arabe, le chinois ou les emoji doivent-ils être échappés ?
Non. Les chaînes JSON sont en Unicode : ces caractères sont valides tels quels et restent lisibles par défaut. N’activez l’option \uXXXX que lorsqu’un système en aval exige de l’ASCII pur ; les emoji sont alors écrits sous forme de leurs deux échappements de substitution obligatoires.
Que signifie « séquence d’échappement invalide » ?
L’entrée contient une barre oblique inverse suivie de quelque chose que JSON ne définit pas, comme \q, ou un \u sans quatre chiffres hexadécimaux derrière. La position est signalée pour que vous puissiez regarder cet endroit : le plus souvent le texte n’avait pas été échappé pour JSON, ou il a été tronqué en cours de route.
Mon texte est-il envoyé quelque part ?
Non. L’échappement comme le décodage s’exécutent entièrement dans votre navigateur : jetons, charges utiles et lignes de journal ne quittent jamais votre appareil.