JSON: pourquoi les barres obliques sont-elles échappées?

369

La raison de cela m'échappe.

JSON échappe à la barre oblique, donc un hachage {a: "a/b/c"}est sérialisé en tant que {"a":"a\/b\/c"}au lieu de {"a":"a/b/c"}.

Pourquoi?

Jason S
la source
4
FWIW Je n'ai jamais vu de barres obliques s'échapper dans JSON, je viens de le remarquer avec la bibliothèque Java sur code.google.com/p/json-simple
Jason S
24
PHP json_encode()échappe les barres obliques par défaut, mais a la JSON_UNESCAPED_SLASHESpossibilité à partir de PHP 5.4.0 (mars 2012)
Walter Tross
6
Voici un code PHP qui n'échappera pas à toutes les '</'echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
barres obliques
Le code inclut-il le '</': ou commence-t-il à l'écho? Parce que commencer à écho échoue pour moi. Je n'ai tout simplement rien. Oui, j'ai remplacé mon $ obj pour ma variable :)
marciokoko
JSON n'échappe ni ne sérialise rien ... votre sérialiseur JSON le fait. Lequel utilisez-vous?
Courses de légèreté en orbite

Réponses:

284

JSON ne vous oblige pas à le faire, il vous permet de le faire. Il vous permet également d'utiliser "\ u0061" pour "A", mais ce n'est pas obligatoire. Permettre \/aide lors de l'incorporation de JSON dans une <script>balise, ce qui n'autorise pas les </chaînes internes, comme le souligne Seb.

Certaines API ASP.NET Ajax / JSON de Microsoft utilisent cette échappatoire pour ajouter des informations supplémentaires, par exemple, un datetime sera envoyé en tant que "\/Date(milliseconds)\/". (Beurk)

Ruben
la source
4
Ce serait une bonne chose, échapper juste </. Bien que JSON ne soit pas souvent intégré aux balises de script de toute façon.
Ruben
8
Voir cet article de blog pour la justification du format de date ASP.NET JSON: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout
25
JSON doit être remplacé car une implémentation particulière d'un sérialiseur JSON génère du JSON qui ( tout en étant JSON entièrement valide ) a quelques caractères supplémentaires, de sorte qu'il peut également être déposé dans un élément de script HTML en tant que littéral JS?! Ce n'est pas tellement jeter le bébé avec l'eau du bain que jeter le bébé parce que quelqu'un lui a acheté un jeu d'ailes d'eau.
Quentin
15
Ce que je ne comprends pas, c'est pourquoi un sérialiseur JSON se soucierait même de l'endroit où se termine le JSON. Sur une page Web, dans une requête HTTP, peu importe. Laissez le rendu final effectuer un codage supplémentaire, s'il en a besoin.
Dan Ross
5
@DanRoss Et c'est possible. Il /n'est pas nécessaire de s'échapper , il est autorisé , pour faciliter l'utilisation de JSON. Si vous ne voulez pas vous échapper /, alors ne le faites pas.
Andreas
35

La spécification JSON indique que vous POUVEZ échapper à la barre oblique, mais ce n'est pas obligatoire.

Harold L
la source
9
Pouvez-vous ajouter un lien vers cette section spécifique?
Ryan Gates
1
La spécification ne dit pas cela. En fait, tout ce qu'il dit, c'est que vous devez échapper au caractère solidus. Voir ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Joa Ebert
10
@JoaEbert: Un solidus inversé doit être échappé, mais vous n'avez pas besoin d'échapper à un solidus. La section 9 dit "Tous les caractères peuvent être placés entre guillemets, à l'exception des caractères qui doivent être échappés: guillemet (U + 0022), solidus inversé (U + 005C) et les caractères de contrôle U + 0000 à U + 001F. "
Harold L
4
Merci Harold! Vous avez raison, également illustré à la figure 5, car «tout point de code sauf ...» indique clairement que / est facultatif.
Joa Ebert
15

J'ai posé la même question il y a quelque temps et j'ai dû y répondre moi-même. Voici ce que j'ai trouvé:

Il semble que ma première pensée [ qu'il provienne de ses racines JavaScript ] était correcte.

'\/' === '/'en JavaScript, et JSON est JavaScript valide. Cependant, pourquoi les autres échappements ignorés (comme \z) ne sont-ils pas autorisés dans JSON?

La clé pour cela était de lire http://www.cs.tut.fi/~jkorpela/www/revsol.html , suivi de http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . La fonctionnalité de la barre oblique permet à JSON d'être incorporé en HTML (comme SGML) et XML.

Boldewyn
la source
5
Un mécanisme de livraison de données utiles structurées ne devrait pas être lié à des constructions de langage ... car cela pourrait changer à l'avenir ... mais cela pourrait expliquer les décisions de conception s'il y avait l'un des créateurs JSON.
'\ /' === '/' Donc, je n'ai pas besoin de décompresser les barres obliques lors de la réception de mon jsonp?
Timmetje
8

PHP échappe les barres obliques par défaut, ce qui explique probablement pourquoi cela apparaît si souvent. Je ne sais pas pourquoi, mais peut-être parce que l'incorporation de la chaîne à l' "</script>"intérieur d'une <script>balise est considérée comme dangereuse.

Cette fonctionnalité peut être désactivée en passant l' JSON_UNESCAPED_SLASHESindicateur mais la plupart des développeurs ne l'utiliseront pas car le résultat d'origine est déjà JSON valide.

Simon East
la source
5

Ugly PHP!

L' JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESoption doit être par défaut, pas une option (étrange) ... Comment le dire aux développeurs php?

La valeur par défaut DOIT être l'utilisation la plus fréquente et les normes (actuelles) les plus utilisées comme UTF8. Combien de fragments de code PHP dans le Github ou ailleurs ont besoin de cette fonctionnalité exoctique "incorporée dans HTML"?

Peter Krauss
la source
2
Bien dit! Cependant, PHP promeut toutes ses erreurs étranges dans le futur, pour ne pas casser aucun des bugs précédents communs dans tous ces extraits de PHP historiques corrompus qui se répandent dans le monde entier comme un parasite. Par conséquent, toutes ces mauvaises décisions prises par PHP, ce qui signifie presque toutes les décisions sur PHP, deviennent la norme. Vous ne pouvez pas vous attendre à ce que les normes changent, par conséquent, chaque développeur PHP doit connaître et implémenter tous ces nombres infinis de solutions de contournement contre tous ces bogues graves trouvés dans PHP. Entrez stackoverflow ..
Tino
Vous vous trompez complètement. Cela est dû à JavaScript. Comme indiqué ci-dessous. Dans JS '\/' === '/'renvoie vrai. Je vous conseille de vous en tenir aux faits. La plupart des gens sont capables de gérer quelques noms de fonction incohérents. Ce n'est pas parce que vous ne pouvez pas voir le passé que PHP n'est pas un mauvais outil.
Cobolt
1
Salut @Cobolt, C'est une vieille question, je n'utilise pas PHP aujourd'hui ... Mais, comme blog de discussion, le noyau est "La valeur par défaut DOIT être l'utilisation la plus fréquente" , donc la laideur consiste à ignorer cette "utilisation la plus fréquente" du comportement (aussi laid) de Javascript.
Peter Krauss
1
Ce n'est pas le lieu de déclamer une langue en particulier. Il aurait été plus utile de souligner ce que PHP fait actuellement et comment le désactiver, et une réponse a maintenant été ajoutée .
IMSoP