web-dev-qa-db-fra.com

Comment échapper à des caractères spéciaux lors de la création d'une chaîne JSON?

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?

157
dinesh707

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:

  • It IS contrairement aux spécifications
  • Ce n'est plus une chaîne valide JSON

Mais cela fonctionne, que vous le vouliez ou non.

Pour les nouveaux lecteurs, utilisez toujours des guillemets doubles pour vos chaînes json.

237
AlexB

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:

Image showing the definition of a string from the JSON spec

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écimaux

Notez 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.

299
Mark Amery

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 \".)

25
David Knipe

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.

7
Kickass

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("\"'\"")
1
YankTHEcode

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.

0
4T2G

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 ").

0
Tom Blitz

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

https://mathiasbynens.be/notes/javascript-escapes

0
Luigi D'Amico

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.

0
Sanju Kaniyamattam