Comment échapper des caractères spéciaux lors de la construction 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 des guillemets simples, identiques à la citation utilisée dans JSON. Ce que je fais, c’est remplir une chaîne à partir des entrées utilisateur telles que le message. Donc, je dois échapper à ce genre de scénarios spéciaux qui enfreignent le code. Mais à part le remplacement de la chaîne, existe-t-il un moyen de les faire échapper, tout en permettant au code HTML de les renvoyer au message correct?

Une chaîne JSON doit être entre guillemets, selon les spécifications , vous n’avez donc pas besoin de vous échapper ' .
Si vous devez utiliser un caractère spécial dans votre chaîne JSON, vous pouvez y échapper en utilisant \ character.

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 s’il est totalement contraire à la spécification, l’auteur pourrait utiliser \' .

C’est mauvais parce que:

  • C’EST contraire aux spécifications
  • Ce n’est plus une chaîne valide JSON

Mais ça marche, comme vous le voulez ou non.

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

Je suis consterné par la présence d’informations erronées très controversées sur une question aussi controversée 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 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 parsingur JSON dans le monde réel sera renvoyé en erreur si vous essayez de le faire parsingr une chaîne entre guillemets simples.

La version de Crockford et d’ECMA affiche même la définition d’une chaîne en utilisant une jolie image, ce qui devrait clarifier clairement le point:

Image montrant la définition d'une chaîne à partir de la spécification JSON

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

Notez que, contrairement aux absurdités de certaines autres réponses, \' n’est jamais une séquence d’échappement valide dans une chaîne JSON. Cela n’a pas besoin d’être, car les chaînes JSON sont toujours entre guillemets.

Enfin, vous ne devriez normalement pas penser à échapper vous-même aux caractères lorsque vous générez du code JSON (bien sûr, vous devrez le faire lorsque vous éditez manuellement un fichier de configuration JSON, par exemple). À la place, formez la structure de données que vous souhaitez encoder en utilisant tous les types natifs de map, array, ssortingng, number, boolean et null que votre langage possède, puis encodez-le en JSON avec une fonction de codage JSON. Une telle fonction est probablement intégrée dans le langage que vous utilisez, comme JSON.ssortingngify de JavaScript, JSON.ssortingngify PHP ou json_encode Python. Si vous utilisez un langage qui ne possède pas de telles fonctionnalités, vous pouvez probablement trouver une bibliothèque d’parsing et d’encodage JSON à utiliser. Si vous utilisez simplement des fonctions de langage ou de bibliothèque pour convertir des choses vers et depuis JSON, vous n’aurez même pas besoin de connaître les règles d’échappement de JSON. C’est ce que la question erronée du demandeur aurait dû faire ici.

Tout le monde parle de comment échapper à un littéral de chaîne ' coté ' . Il y a un problème beaucoup plus important ici: les littéraux de chaîne entre guillemets ne sont pas valides JSON . JSON est basé sur JavaScript, mais ce n’est pas la même chose. Si vous écrivez un littéral d’object dans le code JavaScript, c’est bien; si vous avez réellement besoin de JSON, vous devez utiliser " .

Avec des chaînes entre guillemets, vous n’aurez pas à échapper à la. (Et si vous vouliez un littéral " dans la chaîne, vous utiliseriez \" .)

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 obtenons cela!

J’essayais d’utiliser JQuery AJAX pour publier des données JSON sur le serveur et renvoyer plus tard ces mêmes informations. La meilleure solution à la question affiché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.ssortingngify(d), ... } 

Cela échappera aux personnages pour vous.

Cela a également été suggéré par Mark Amery, Grande réponse BTW

J’espère que cela aide quelqu’un.

Peut-être je suis trop en retard à la fête, mais cela permettra d’parsingr / échapper seul devis (ne veulent pas entrer dans une bataille sur l’parsing vs évasion) ..

 JSON.parse("\"'\"") 

La réponse à la question directe:
Pour être sûr, remplacez le caractère requirejs 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

Je pense que nous sums tous d’accord pour dire que les auteurs uniques ne sont pas de vrais amateurs. Quoi qu’il en soit, nous avons encore besoin d’aborder la question de l’évasion »dans une chaîne de caractères json à guillemets doubles, en l’absence de bibliothèques capables de le faire pour nous.

Remplacer chaque “avec un \” N’EST PAS ASSEZ: L’utilisateur peut entrer l’entrée: \ et l’parsing, 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 “).

Ceci est un problème si vous incluez vos données dans un fichier HTML de la manière suivante (en utilisant le moteur de template ejs):

  

Si data contient une chaîne avec des guillemets simples, cette erreur se produira, à moins que vous ne convertissiez ' en \' ce qui n’est possible que par la chaîne "\\\'"

  

Pas joli, mais ça marche.

concernant le post de AlexB:

  \' Apostrophe or single quote \" Double quote 

échapper des guillemets simples n’est valide que dans des chaînes json
échapper des guillemets doubles n’est valide que dans des chaînes json à guillemets doubles

Exemple:

 'Bart\'s car' -> valid 'Bart says \"Hi\"' -> invalid