Voici ma ficelle
{
'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 à la citation utilisée dans JSON. Ce que je fais est de remplir une chaîne à partir d'entrées utilisateur telles que message. Je dois donc échapper à ce genre de scénario spécial qui casse le code. Mais hormis le remplacement de chaîne, existe-t-il un moyen de les échapper tout en permettant à HTML de les traiter en retour vers le bon message?
Une chaîne JSON doit être double, conformément à la spécification specs , vous n'avez donc pas besoin d'échapper à '
.
Si vous devez utiliser un caractère spécial dans votre chaîne JSON, vous pouvez l'échapper en utilisant le caractère \
.
Voir cette liste de caractères spéciaux utilisés dans JSON:
\b Backspace (ascii code 08)
\f Form feed (ascii code 0C)
\n New line
\r Carriage return
\t Tab
\" Double quote
\\ Backslash character
Cependant, même si cela est totalement contraire à la spécification, l'auteur pourrait utiliser \'
.
Ceci 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.
Je suis consterné par la présence de désinformation très élevée sur une question aussi bien vue sur un sujet fondamental.
Les chaînes JSON ne peuvent pas être citées avec des guillemets simples. Les différentes versions de la spécification ( l'original de Douglas Crockford, la version ECMA , et la version IETF ) indiquent 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 la réponse acceptée actuellement; tout analyseur JSON dans le monde réel générera une erreur si vous essayez de le faire analyser une chaîne entre guillemets.
Les versions de Crockford et d'ECMA affichent même la définition d'une chaîne en utilisant une jolie image, ce qui devrait rendre le point clair:
La jolie image répertorie également toutes les séquences d'échappement légitimes d'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 lorsque par programme générez du JSON (bien entendu, vous le ferez lors de l'édition manuelle, par exemple, d'un fichier de configuration basé sur JSON). A la place, créez la structure de données que vous souhaitez coder en utilisant les types de mappage, tableau, chaîne, nombre, booléen et null natifs de votre langue, puis codez-la au format JSON avec une fonction de codage JSON. Une telle fonction est probablement construite dans le langage que vous utilisez, comme JSON.stringify
de JavaScript, json_encode
de PHP ou json.dumps
de Python. Si vous utilisez un langage qui ne possède pas cette fonctionnalité, vous pouvez probablement trouver une bibliothèque d'analyse et d'encodage JSON à utiliser. Si vous utilisez simplement des fonctions de langage ou de bibliothèque pour convertir des éléments vers et à partir de JSON, vous n'aurez même jamais besoin de connaître les règles d'échappement de JSON. C’est ce que le demandeur peu judicieux aurait dû faire ici.
Tout le monde parle de la façon d'échapper à '
dans une chaîne littérale '
-quoted. Le problème est bien plus important ici: les littéraux de chaîne entre guillemets simples ne sont pas valides. JSON . JSON est basé sur JavaScript, mais ce n'est pas la même chose. Si vous écrivez un objet littéral dans le code JavaScript, c'est bien; Si vous avez réellement besoin de JSON, vous devez utiliser "
.
Avec les chaînes entre guillemets, vous n'avez pas besoin d'échapper au '
. (Et si vous voulez un "
littéral dans la chaîne, vous utiliseriez \"
.)
La plupart de ces réponses ne répondent pas à la question ou leur explication est trop longue.
OK, JSON utilise uniquement des guillemets doubles, nous l’avons!
J'essayais d'utiliser JQuery AJAX pour envoyer des données JSON au serveur, puis de renvoyer cette même information . La meilleure solution à la question publiée que j'ai trouvée était d'utiliser:
var d = {
name: 'whatever',
address: 'whatever',
DOB: '01/01/2001'
}
$.ajax({
type: "POST",
url: 'some/url',
dataType: 'json',
data: JSON.stringify(d),
...
}
Cela échappera aux personnages pour vous.
Cela a également été suggéré par Mark Amery, excellente réponse BTW
J'espère que ça aide quelqu'un.
Peut-être que je suis trop tard pour la fête, mais cela analysera/échappera à une citation simple (ne veut pas entrer dans une bataille entre parse et évasion) ..
JSON.parse("\"'\"")
Pour autoriser les guillemets simples au sein d'une chaîne de guillemets doublbule aux fins de json, vous doublez la citation simple. {"X": "Quelle est la question"} ==> {"X": "Quelle est la question"}
https://codereview.stackexchange.com/questions/69266/json-conversion-to-single-quotes
La séquence n'est pas valide.
Je pense que nous sommes tous d’accord sur le fait que les simples cités ne sont pas de vrais jsons. Quoi qu’il en soit, nous devons encore aborder la question de l’échappement "au sein d’une chaîne json à double guillemet, en l’absence de bibliothèques pour le faire pour nous.
Remplacer chaque "par un \" n’EST PAS ASSEZ: L’utilisateur peut entrer l’entrée:\ Et l’analyse, à nouveau, échoue (pensez pourquoi).
Au lieu de cela, commencez par remplacer chaque\par\(double barre oblique inversée) . Ensuite seulement, remplacez chaque "par \" (barre oblique inverse suivie de ").
La réponse à la question directe:
Pour plus de sécurité, remplacez le caractère requis par\u + valeur hexadécimale à 4 chiffres
Exemple: Si vous voulez échapper à l’apostrophe ', remplacez-le par\u0027
D'Amico devient D\u0027Amico
Nice REFERENCE: http://es5.github.io/x7.html#x7.8.4
Utilisez encodeURIComponent () pour encoder 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.