Selon le diagramme de la machine à états sur le Site web JSON Dans le cas d'un système de gestion de l'information, seuls les guillemets doubles échappés sont autorisés, et non les guillemets simples. Les guillemets simples n'ont pas besoin d'être échappés :
Mise à jour - Plus d'informations pour ceux qui sont intéressés :
Douglas Crockford ne dit pas spécifiquement pourquoi la spécification JSON n'autorise pas les guillemets simples échappés dans les chaînes de caractères. Cependant, au cours de sa discussion sur JSON dans le document Annexe E de JavaScript : Les bons côtés Il écrit :
Les objectifs de conception de JSON étaient d'être minimalistes, portables, textuels et un sous-ensemble de JavaScript. Moins nous avons besoin de nous mettre d'accord pour interagir, plus nous pouvons interagir facilement.
Il a donc peut-être décidé de n'autoriser la définition des chaînes qu'à l'aide de guillemets doubles, car cela représente une règle de moins sur laquelle toutes les implémentations JSON doivent s'accorder. Par conséquent, il est impossible qu'un simple caractère guillemet dans une chaîne de caractères termine accidentellement la chaîne, car par définition, une chaîne de caractères ne peut être terminée que par un caractère guillemet double. Il n'est donc pas nécessaire d'autoriser l'échappement d'un caractère guillemet simple dans la spécification formelle.
En creusant un peu plus, Crockford's org.json L'implémentation de JSON pour Java est plus permise et plus efficace. fait autorisent les caractères guillemets simples :
Les textes produits par les méthodes toString sont strictement conformes aux règles de syntaxe JSON. Les constructeurs sont plus indulgents quant aux textes qu'ils acceptent :
...
- Les chaînes de caractères peuvent être citées avec ' (guillemet simple).
Ceci est confirmé par le JSONTokener code source. Le site nextString
accepte les caractères guillemets simples échappés et les traite comme des caractères guillemets doubles :
public String nextString(char quote) throws JSONException {
char c;
StringBuffer sb = new StringBuffer();
for (;;) {
c = next();
switch (c) {
...
case '\\':
c = this.next();
switch (c) {
...
case '"':
case '\'':
case '\\':
case '/':
sb.append(c);
break;
...
En haut de la méthode se trouve un commentaire informatif :
Le format JSON formel n'autorise pas les chaînes entre guillemets simples, mais une implémentation est autorisée à les accepter.
Certaines implémentations acceptent donc les guillemets simples, mais il ne faut pas s'y fier. De nombreuses implémentations populaires sont assez restrictives à cet égard et rejetteront JSON qui contient des chaînes entre guillemets simples et/ou des guillemets simples échappés.
Enfin, pour en revenir à la question initiale, jQuery.parseJSON
tente d'abord d'utiliser le parseur JSON natif du navigateur ou une bibliothèque chargée telle que json2.js le cas échéant (qui, soit dit en passant, est la bibliothèque sur laquelle la logique de jQuery est basée si JSON
n'est pas défini). Ainsi, jQuery ne peut être aussi permissif que cette mise en œuvre sous-jacente :
parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
jQuery.error( "Invalid JSON: " + data );
},
Pour autant que je sache, ces implémentations n'adhèrent qu'à la spécification officielle de JSON et n'acceptent pas les guillemets simples, donc jQuery non plus.