Voici ma chaîne
{
'user': {
'name': 'abc',
'fx': {
'message': {
'color': 'red'
},
'user': {
'color': 'blue'
}
}
},
'timestamp': '2013-10-04T08: 10: 41+0100',
'message': 'I'mABC..',
'nanotime': '19993363098581330'
}
Ici, le message contient un guillemet simple, identique à celui utilisé dans JSON. Ce que je fais est de remplir une chaîne à partir d'entrées utilisateur telles qu'un message. Donc, j'ai besoin d'échapper à ce genre de scénarios spéciaux qui cassent le code. Mais à part le remplacement de chaîne, existe-t-il un moyen de les faire échapper mais tout de même permettre à HTML de les renvoyer au bon message?
Réponses:
Une chaîne JSON doit être placée entre guillemets, conformément aux spécifications , afin que vous n'ayez pas besoin de vous échapper
'
.Si vous devez utiliser un caractère spécial dans votre chaîne JSON, vous pouvez l'échapper en utilisant
\
caractère.Voir cette liste de caractères spéciaux utilisés dans JSON:
Cependant, même si cela est totalement contraire à la spécification, l'auteur pourrait utiliser
\'
.C'est mauvais parce que:
Mais cela fonctionne, que vous le vouliez ou non.
Pour les nouveaux lecteurs, utilisez toujours des guillemets doubles pour vos chaînes json.
la source
JSON.parse("'foo'")
dans la console de votre navigateur, par exemple, et observez leSyntaxError: Unexpected token '
. La spécification JSON est vraiment simple et claire à ce sujet. Il n'y a pas de séquence d'échappement dans JSON pour les guillemets simples, et une chaîne JSON ne peut pas être mise entre guillemets simples.'
, de la même manière que c'est techniquement vrai mais trompeur de dire que légalement vous n'avez pas besoin de tuer des enfants. Plus correct serait de dire que vous ne pouvez pas vous échapper'
.\'
est une séquence d'échappement illégale, et si vous l'utilisez, votre JSON n'est pas un JSON valide et tout analyseur JSON s'y étouffera. (Certainement JavaScriptJSON.parse
et Python lejson.loads
font.)\'
séquence d'échappement "fonctionne, que vous le vouliez ou non" . C'est faux. Je vous mets au défi d'exposer tout analyseur JSON couramment utilisé qui ne s'étouffera pas avec les chaînes entre guillemets simples ou la\'
séquence. J'ai déjà souligné queJSON.parse("'foo'")
etJSON.parse('"\\\'"')
(en JavaScript) etjson.loads("'foo'")
etjson.loads('"\\\'"')
(en Python) lèvent tous deux des exceptions. Quelle est la base de votre affirmation selon laquelle l'utilisation de ces constructions "fonctionne"?'
tant que\u0027
, non pas que vous pouvez y échapper en tant que\'
.'
" (et en comparant un tel acte au meurtre d'enfants!) Est techniquement faux; plus précis est de dire que vous pouvez y échapper, tout simplement pas\'
. Je ne m'étais pas rendu compte que la version RFC de la spécification faisait référence à des séquences comme\u0027
un moyen d'échapper aux personnages qu'elles représentent. Le point clé qui\'
est illégal, cependant, est toujours vrai et important.Je suis consterné par la présence de fausses informations très votées sur une question aussi bien vue sur un sujet fondamental.
Les chaînes JSON ne peuvent pas être entre guillemets simples . Les différentes versions de la spécification ( l'original par Douglas Crockford, la version ECMA et la version IETF ) indiquent toutes que les chaînes doivent être entre guillemets. Ce n'est pas une question théorique, ni une question d'opinion comme le suggère actuellement la réponse acceptée; tout analyseur JSON dans le monde réel affichera une erreur si vous essayez de le faire analyser une chaîne entre guillemets simples.
La version de Crockford et de l'ECMA affiche même la définition d'une chaîne à l'aide d'une jolie image, ce qui devrait clarifier le point sans ambiguïté:
La jolie image répertorie également toutes les séquences d'échappement légitimes dans une chaîne JSON:
\"
\\
\/
\b
\f
\n
\r
\t
\u
suivi de quatre chiffres hexadécimauxNotez que, contrairement au non-sens dans certaines autres réponses ici,
\'
n'est jamais une séquence d'échappement valide dans une chaîne JSON. Ce n'est pas nécessaire, car les chaînes JSON sont toujours entre guillemets.Enfin, vous ne devriez normalement pas avoir à penser à échapper des caractères vous-même lors de la génération par programme de JSON (bien sûr, vous le ferez lors de l'édition manuelle, par exemple, d'un fichier de configuration basé sur JSON). Au lieu de cela, formez la structure de données que vous souhaitez coder en utilisant les types de carte, tableau, chaîne, nombre, booléen et null natifs de votre langue, puis codez-les en JSON avec une fonction de codage JSON. Une telle fonction est probablement intégrée dans le langage que vous utilisez, comme JavaScript
JSON.stringify
, PHPjson_encode
ou Python.json.dumps
. Si vous utilisez un langage qui n'a pas une telle fonctionnalité intégrée, vous pouvez probablement trouver une bibliothèque d'analyse et de codage JSON à utiliser. Si vous utilisez simplement des fonctions de langage ou de bibliothèque pour convertir des éléments vers et depuis JSON, vous n'aurez même jamais besoin de connaître les règles d'échappement de JSON. C'est ce que le questionneur erroné aurait dû faire ici.la source
Tout le monde parle de comment s'échapper
'
dans un'
littéral de chaîne entre guillemets. Il y a un problème beaucoup plus important ici: les littéraux de chaîne entre guillemets simples ne sont pas des JSON valides . JSON est basé sur JavaScript, mais ce n'est pas la même chose. Si vous écrivez un objet littéral dans du code JavaScript, très bien; si vous avez réellement besoin de JSON, vous devez utiliser"
.Avec des chaînes entre guillemets doubles, vous n'aurez pas besoin d'échapper à la
'
. (Et si vous vouliez un littéral"
dans la chaîne, vous l'utiliseriez\"
.)la source
'
. Par exemple, si ma valeur de chaîne est"Member's_id" : 4
, dites-vous qu'elle n'a pas besoin d'être échappée? Apparemment, j'ai un problème où cela donne une erreur de mauvais codage: UTF-8 et il est lu commeMember�s
. C'est un fichier json généré manuellement.'
dans une chaîne JSON, le littéral ne doit pas être échappé. L'avez-vous copié-collé quelque part? C'est peut-être vraiment\u2019
une apostrophe, pas une. Ma conjecture: quelqu'un l'a tapé dans MS Word, ce qui l'a transformé en guillemets parce qu'il pense qu'il sait mieux. Grammaticalement, le bon vieux apostrophe de caractère ASCII ('
, alias\x27
, que nous appelions jusqu'à présent "guillemet simple") est celui que vous voulez. Mais il serait toujours bien de résoudre votre problème d'encodage de caractères, au cas où il y aurait d'autres problèmes similaires. Choisissez donc un codage de caractères et utilisez-le pour les lectures et les écritures. Ou échapper à l'aide\u
.La plupart de ces réponses ne répondent pas à la question ou sont inutilement longues dans l'explication.
OK, JSON n'utilise que des guillemets doubles, nous comprenons!
J'essayais d'utiliser JQuery AJAX pour publier des données JSON sur le serveur, puis renvoyer plus tard ces mêmes informations. La meilleure solution à la question que j'ai trouvée était d'utiliser:
Cela échappera aux personnages pour vous.
Cela a également été suggéré par Mark Amery, Great answer BTW
J'espère que cela aide quelqu'un.
la source
Peut-être que je suis trop en retard pour la fête, mais cela analysera / échappera à une citation simple (je ne veux pas entrer dans une bataille sur l'analyse par rapport à l'évasion) ..
la source
La réponse à la question directe:
Pour être sûr, remplacez le caractère requis par \ u + valeur hexadécimale à 4 chiffres
Exemple: si vous voulez échapper à l'apostrophe, remplacez par \ u0027
D'Amico devient D \ u0027Amico
BELLE RÉFÉRENCE: http://es5.github.io/x7.html#x7.8.4
https://mathiasbynens.be/notes/javascript-escapes
la source
\'
.Utilisez encodeURIComponent () pour coder la chaîne.
Par exemple. var product_list = encodeURIComponent (JSON.stringify (product_list));
Vous n'avez pas besoin de le décoder car le serveur Web fait automatiquement la même chose.
la source
Utilisation des modèles de littéraux ...
la source
Je pense que nous sommes tous d'accord pour dire que les jsons simples ne sont pas de vrais jsons. Quoi qu'il en soit, nous devons encore aborder la question de l'échappement "dans une chaîne json entre guillemets doubles, en l'absence de bibliothèques pour le faire pour nous.
Remplacer chaque "par un \" NE SUFFIT PAS: L'utilisateur peut entrer l'entrée: \ et l'analyse, encore une fois, échoue (pensez pourquoi).
Au lieu de cela, remplacez d'abord chaque \ par \ (double barre oblique inverse). Seulement alors, remplacez chaque "par \" (barre oblique inverse suivie de ").
la source
Pour autoriser les guillemets simples au sein de la chaîne entre guillemets dans le cadre de json, vous doublez le guillemet simple. {"X": "Quelle est la question"} ==> {"X": "Quelle est la question"}
/codereview/69266/json-conversion-to-single-quotes
La séquence \ 'n'est pas valide.
la source
concernant le poste d'AlexB:
l'échappement des guillemets simples n'est valide que dans les chaînes json entre guillemets simples
échappement des guillemets doubles n'est valide que dans les chaînes json entre guillemets doubles
exemple:
la source