Échapper du JSON
Transforme n’importe quel texte en chaîne sûre à intégrer dans du JSON.
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
Transformez un texte quelconque en quelque chose que l’on peut placer sans risque dans une chaîne JSON. Guillemets, antislashs, sauts de ligne, tabulations et caractères de contrôle sont échappés ; tout le reste est laissé tel quel.
C’est l’opération dont vous avez besoin quand vous insérez à la main un payload, une ligne de journal, une requête SQL ou un fragment HTML dans un champ JSON.
Ce qui doit être échappé, et ce qui ne doit pas l’être
JSON définit exactement neuf séquences d’échappement et impose l’échappement dans exactement trois situations.
- Le guillemet double
- Devient \". Il terminerait sinon la chaîne.
- L’antislash
- Devient \\. Il démarrerait sinon un échappement.
- Les caractères de contrôle, U+0000 à U+001F
- Un saut de ligne devient \n, une tabulation \t, un retour chariot \r, un retour arrière \b, un saut de page \f. Tout le reste de cette plage prend la forme \uXXXX.
- La barre oblique
- Peut être échappée en \/ mais n’est pas obligée de l’être. Les deux formes désignent le même caractère. L’échappement existe pour pouvoir insérer du JSON dans un élément script HTML, où la séquence </ y mettrait fin.
- Les caractères non-ASCII
- N’ont pas besoin d’être échappés. JSON est en UTF-8 et é, 你 et 🎉 sont tous légaux littéralement. Les échapper est une option ici, pour les systèmes qui abîment le non-ASCII en transit.
- L’apostrophe
- N’a besoin de rien. À l’intérieur d’une chaîne entre guillemets doubles c’est un caractère ordinaire, et \' n’est pas un échappement JSON valide.
Demi-codets et émojis
Un caractère hors du Plan Multilingue de Base, ce qui inclut tous les émojis, est stocké sur deux unités de code UTF-16. L’échapper produit deux séquences \u, comme \ud83c\udf89 pour un cotillon. C’est correct et tout analyseur reconstitue le caractère.
Un demi-codet isolé, la moitié d’une telle paire sans son partenaire, est toujours échappé ici même quand rien d’autre ne l’est, car l’émettre littéralement produit un texte qui n’est pas de l’Unicode bien formé et qui se corrompt au ré-encodage en UTF-8.
La meilleure réponse, la plupart du temps
Si vous échappez à la main dans le but de construire du JSON, arrêtez et sérialisez plutôt. JSON.stringify, json.dumps et leurs équivalents échappent correctement chaque valeur par construction, et ils ne peuvent pas en oublier une.
Le JSON fabriqué à la main est la cause profonde de presque toutes les erreurs de caractère de contrôle invalide et de chaîne non terminée qui existent.
How to do this in code
Échapper en code.
js JavaScript
// Escaped and quoted
const quoted = JSON.stringify(text);
// Escaped without the surrounding quotes
const escaped = JSON.stringify(text).slice(1, -1); py Python
import json
quoted = json.dumps(text) # with quotes, non-ASCII escaped
quoted = json.dumps(text, ensure_ascii=False) # with quotes, é stays é
escaped = json.dumps(text)[1:-1] sh Shell
# jq's @json filter escapes and quotes
printf '%s' "$text" | jq -Rs @json
# -R reads raw input, -s slurps it into one string go Go
b, _ := json.Marshal(text) // includes the quotes
// Marshal escapes <, > and & by default for HTML safety.
// To turn that off you need an Encoder:
var buf bytes.Buffer
enc := json.NewEncoder(&buf)
enc.SetEscapeHTML(false)
enc.Encode(text) Questions fréquentes
- Dois-je échapper les apostrophes ?
- Non. Dans une chaîne JSON entre guillemets doubles, une apostrophe est un caractère ordinaire, et \' n’est pas du tout un échappement JSON valide. Il l’est en JavaScript et en JSON5, d’où vient l’habitude.
- Faut-il échapper les caractères non-ASCII ?
- Pas en général. JSON est en UTF-8 et les caractères accentués, le CJK et les émojis sont tous légaux littéralement. Ne les échappez que si quelque chose dans la chaîne de traitement abîme le non-ASCII, ce qui est une raison de réparer cette chaîne.
- Et un chemin Windows ?
- Chaque antislash double : C:\\Users\\priya. Un chemin se terminant par un seul antislash est pire que faux, car il échappe le guillemet de fermeture et avale le reste de votre document.