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.
Any character may be escaped
, cela peut expliquer pourquoi certaines implémentations permettraient d'échapper les guillemets simples.\'
est écrite n'est toujours pas autorisé. Ce serait bien si le RFC était plus explicite sur ce point.Si vous avez besoin d'un guillemet simple à l'intérieur d'une chaîne, puisque \ 'n'est pas défini par la spécification, utilisez
\u0027
voir http://www.utf8-chartable.de/ pour tousmodifier: veuillez excuser ma mauvaise utilisation du mot backticks dans les commentaires. Je voulais dire barre oblique inverse. Mon point ici est que dans le cas où vous avez des chaînes imbriquées dans d'autres chaînes, je pense qu'il peut être plus utile et plus lisible d'utiliser unicode au lieu de beaucoup de barres obliques inverses pour échapper à une seule citation. Si vous n'êtes pas imbriqué, il est vraiment plus facile de simplement y mettre une vieille citation.
la source
var jsonEncodedAsString = <?= json_encode(myEncodedJson) ?>
oùmyEncodedJson
est le résultat d'un précédentjson_encode
qui prendra soin d'échapper à votre guillemet simple, en fait, il produira simplement quelque chose d'une grosse chaîne entourée de guillemets doubles, donc les guillemets simples ne seront pas échappés, mais les guillemets doubles volonté.Je comprends où se situe le problème et quand je regarde les spécifications, il est clair que les guillemets simples non échappés doivent être analysés correctement.
J'utilise la fonction jQuery.parseJSON de jquery pour analyser la chaîne JSON mais j'obtiens toujours l'erreur d'analyse lorsqu'il y a un seul guillemet dans les données préparées avec json_encode.
Serait-ce une erreur dans mon implémentation qui ressemble à ceci (PHP - côté serveur):
La dernière étape consiste à stocker la chaîne codée JSON dans une variable JS:
Si j'utilise "" au lieu de '', cela génère toujours une erreur.
SOLUTION:
La seule chose qui a fonctionné pour moi a été d'utiliser le masque bitmap JSON_HEX_APOS pour convertir les guillemets simples comme ceci:
Existe-t-il une autre façon de résoudre ce problème? Mon code est-il incorrect ou mal écrit?
Merci
la source
Lorsque vous envoyez un devis unique dans une requête
Lorsque vous obtenez la valeur, y compris un seul devis
Si vous souhaitez rechercher / insérer la valeur qui inclut un seul devis dans une requête
xxx=Replace(empid,"'","''")
la source
Frapper un problème similaire en utilisant CakePHP pour sortir un bloc de script JavaScript en utilisant PHP natif
json_encode
.$contractorCompanies
contient des valeurs qui ont des guillemets simples et comme expliqué ci-dessus et attendujson_encode($contractorCompanies)
ne leur échappe pas parce que son JSON valide.En ajoutant des addlashes () autour de la chaîne encodée JSON, vous échappez ensuite les guillemets permettant à Cake / PHP de faire écho au javascript correct au navigateur. Les erreurs JS disparaissent.
la source
J'essayais d'enregistrer un objet JSON d'une demande XHR dans un attribut HTML5 data- *. J'ai essayé plusieurs des solutions ci-dessus sans succès.
Ce que j'ai finalement fini par remplacer le guillemet simple
'
par son code à l''
aide d'une expression régulière après l'appel de la méthode stringify () de la manière suivante:la source
Intéressant. Comment générez-vous votre JSON côté serveur? Utilisez-vous une fonction de bibliothèque (telle que
json_encode
en PHP), ou construisez-vous la chaîne JSON à la main?La seule chose qui attire mon attention est l'apostrophe d'échappement (
\'
). Étant donné que vous utilisez des guillemets doubles, comme vous le devriez, il n'est pas nécessaire d'échapper aux guillemets simples. Je ne peux pas vérifier si c'est bien la cause de votre erreur jQuery, car je n'ai pas encore mis à jour moi-même la version 1.4.1.la source