Selon le diagramme de la machine d'état sur le site Web JSON , seuls les caractères entre guillemets d'échappement sont autorisés, pas les guillemets simples. Il n'est pas nécessaire d'échapper les caractères de guillemet simple:
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. Cependant, lors de sa discussion sur JSON dans l' annexe E de JavaScript: The Good Parts , il écrit:
Les objectifs de conception de JSON devaient être minimes, portables, textuels et un sous-ensemble de JavaScript. Moins nous devons nous mettre d'accord pour interopérer, plus facilement nous pouvons interopérer.
Il a donc peut-être décidé de ne permettre que la définition de chaînes à l'aide de guillemets doubles, car il s'agit d'une règle de moins sur laquelle toutes les implémentations JSON doivent se mettre d'accord. Par conséquent, il est impossible pour un caractère guillemet simple dans une chaîne de terminer accidentellement la chaîne, car par définition une chaîne ne peut être terminée que par un caractère guillemet double. Par conséquent, il n'est pas nécessaire d'autoriser l'échappement d'un seul caractère guillemet dans la spécification formelle.
Creuser un peu plus profond, de Crockford
org.json la mise en œuvre de JSON pour Java est plus permissive et
ne permet de guillemets simples:
Les textes produits par les méthodes toString sont strictement conformes aux règles de syntaxe JSON. Les constructeurs sont plus indulgents dans les textes qu'ils accepteront:
...
- Les chaînes peuvent être citées avec '(guillemet simple).
Ceci est confirmé par le code source de JSONTokener . La nextString
méthode accepte les caractères de guillemet simple d'échappement et les traite comme des caractères de guillemet double:
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.
Ainsi, certaines implémentations accepteront des guillemets simples - mais vous ne devriez pas vous fier à cela. 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 rattacher cela à la question d'origine, essayez d'jQuery.parseJSON
abord d'utiliser l'analyseur JSON natif du navigateur ou une bibliothèque chargée telle que json2.js, le cas échéant (qui sur une note latérale est la bibliothèque sur laquelle la logique jQuery est basée si JSON
n'est pas définie) . Ainsi, jQuery ne peut être aussi permissif que cette implémentation 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 adhèrent uniquement à la spécification JSON officielle et n'acceptent pas les guillemets simples, donc jQuery non plus.