270 votes

Comment échapper aux caractères spéciaux lors de la construction d'une chaîne JSON ?

Voici ma chaîne de caractères

{
    '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 aux guillemets utilisés dans JSON. Ce que je fais, c'est remplir une chaîne de caractères à partir des entrées de l'utilisateur telles que le message. J'ai donc besoin d'échapper à ce genre de scénarios spéciaux qui cassent le code. Mais à part le remplacement de la chaîne, existe-t-il un moyen de les faire échapper tout en permettant au HTML de les traiter pour les ramener au message correct ?

486voto

Mark Amery Points 4705

Je suis consterné par la présence d'informations erronées fortement votées sur une question aussi populaire portant sur un sujet de base.

Chaînes JSON ne peut pas être placé entre guillemets simples . Les différentes versions de la spécification ( l'original par Douglas Crockford, la version ECMA et le Version IETF ) indiquent tous que les chaînes de caractères doivent être citées avec des guillemets doubles. Il ne s'agit pas d'une question théorique, ni d'une question d'opinion comme le suggère actuellement la réponse acceptée ; n'importe quel analyseur JSON dans le monde réel se trompera si vous essayez de lui faire analyser une chaîne de caractères entre guillemets simples.

Les versions de Crockford et de l'ECMA affichent même la définition d'une chaîne de caractères à l'aide d'une jolie image, ce qui devrait rendre le message clair et sans ambiguïté :

Image showing the definition of a string from the JSON spec

La jolie image énumère é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 à ce qui est dit dans d'autres réponses ici, il n'y a pas d'absurdité, \' 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 mises entre guillemets.

Enfin, vous ne devriez normalement pas avoir à vous préoccuper de l'échappement des caractères lors de l'utilisation de la fonction de manière programmée générant du JSON (bien que vous le fassiez évidemment lorsque vous éditez manuellement, par exemple, un fichier de configuration basé sur du JSON). Au lieu de cela, formez la structure de données que vous souhaitez encoder en utilisant les types natifs map, array, string, number, boolean et null dont dispose votre langage, puis encodez-la en JSON à l'aide d'une fonction d'encodage JSON. Une telle fonction est probablement intégrée au langage que vous utilisez, comme la fonction JSON.stringify , de PHP json_encode ou de Python json.dumps . Si vous utilisez un langage qui ne dispose pas d'une telle fonctionnalité, vous pouvez probablement trouver une bibliothèque d'analyse et d'encodage JSON à utiliser. Si vous utilisez simplement les fonctions du langage ou de la bibliothèque pour convertir des éléments depuis et vers JSON, vous n'aurez jamais besoin de connaître les règles d'échappement de JSON. C'est ce que l'auteur de la question aurait dû faire.

347voto

AlexB Points 5110

Une chaîne JSON doit être mise entre guillemets, conformément à la norme 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 l'échapper en utilisant \ caractère.

Voir la liste des 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

Toutefois, même si cela est totalement contraire à la spécification, l'auteur peut utiliser les éléments suivants \' .

Il s'agit de mauvais parce que :

  • C'est contraire aux spécifications
  • Il ne s'agit plus d'une chaîne de caractères 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.

48voto

David Knipe Points 2586

Tout le monde parle de la façon de s'échapper ' dans un ' -chaîne de caractères entre guillemets. Il s'agit d'un problème beaucoup plus important : les chaînes de caractères 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 à l'intérieur d'un code JavaScript, très bien ; si vous avez réellement besoin de JSON, vous devez utiliser " .

Avec les chaînes de caractères à double guillemet, il n'est pas nécessaire d'échapper le caractère ' . (Et si vous voulez un " dans la chaîne, vous utiliserez \" .)

7voto

Kickass Points 770

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 l'avons compris !

J'essayais d'utiliser JQuery AJAX pour envoyer des données JSON au serveur et renvoyer ensuite ces mêmes informations. La meilleure solution que j'ai trouvée pour répondre à la question posé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 vous permettra d'échapper aux caractères.

Ceci a également été suggéré par Mark Amery, excellente réponse BTW.

J'espère que cela aidera quelqu'un.

1voto

YankTHEcode Points 119

Il est possible que j'arrive trop tard à la fête, mais ceci va parser/échapper les guillemets simples (je ne veux pas entrer dans une bataille sur parse vs escape)

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X