Question

Une double citation, même si échappé est de lancer erreur d'analyse.
regardez le code ci-dessous

//parse the json in javascript  
var testJson = '{"result": ["lunch", "\"Show\""] }';  
var tags = JSON.parse(testJson);  
alert (tags.result[1]);

est de lancer erreur d'analyse en raison des guillemets doubles (qui sont déjà échappé).
Même eval() ne fonctionnera pas ici.
Mais si j'échapper avec deux barres obliques comme ceci:

var result = '{"result": ["lunch", "\\"Show\\""] }';  
var tags = JSON.parse(result);  
alert (tags.result[1]);

il fonctionne très bien.
Pourquoi avons-nous besoin d'utiliser une double barre oblique ici en javascript? Le problème est que la fonction PHP json_encode() échappe une double citation avec une seule barre oblique (comme celui-ci: \"show\") qui JSON.parse ne sera pas en mesure d'analyser. Comment puis-je gérer cette situation?

Était-ce utile?

La solution

Eh bien, enfin, l'analyse syntaxique de JSON utilise le même eval, donc il n'y a pas de différence quand vous leur donnez lissée. avec une syntaxe incorrecte. Dans ce cas, vous devez échapper correctement vos citations en php, puis leur échapper et leur Escaping barres obliques avec json_encode

<?php
    $json = '{"result": ["lunch", "\"Show\""] }';
    echo json_encode($json);
?>

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"

Cela devrait fonctionner sur JS côté client (si je l'ai fait pas des fautes de frappe).

Autres conseils

Javascript déprotège ses cordes et JSON les déprotège ainsi. la première chaîne ('{"result": ["lunch", "\"Show\""] }') est vu par l'analyseur comme json {"result": ["lunch", ""Show""] }, parce que \" javascript signifie ", mais ne quitte pas la double chaîne entre guillemets.

La deuxième chaîne '{"result": ["lunch", "\\\"Show\\\""] }' obtient d'abord unescape à {"result": ["lunch", "\"Show\""] } (et qui est correctement unescape par JSON).

Je pense que '{"result": ["lunch", "\\"Show\\""] }' devrait fonctionner aussi.

Ce problème est causé par les deux plié chaîne mécanisme d'échappement: vient de JS et vient de JSON

.

Une combinaison de la barre oblique inverse combiné avec un autre caractère suivant est utilisé pour représenter un caractère qui ne soit pas représentable par ailleurs dans la chaîne. '' \\ '' signifie '\', etc.

Ce mécanisme d'échappement a lieu avant JSON.parse () fonctionne.

Par exemple,

var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}');
console.log(parsedObj.sentence);
>>>"It is one backslash(\)"

Du point de vue du générateur de chaîne, il passe quatre contrecoups '\' dans le JavaScript interpretor.

Du point de vue de interpretor JavaScript, il inteprets il y a deux contrecoups (\) que chaque '\\' séquence sera interprétée comme un '\'.

Du point de vue de l'analyseur de JSON, il reçoit deux contrecoups (\\) et les règles d'échappement de chaîne JSON va parse comme un seul « \ » qui est le résultat de sortie.

Expliquez d'abord le code:

var testJson = '{"result": ["lunch", "\"Show\""] }';
//The real string after sequence escaping in to JS is
//'{"result": ["lunch", ""Show""] }' 
//which is passed into the JSON.parse.
//Thus, it breaks the JSON grammar and generates an error
var tags = JSON.parse(testJson);  
alert (tags.result[1]);

De la docs

  

JSON_HEX_APOS (entier) Tous les 'sont convertis en \ u0027
  JSON_HEX_QUOT (entier) All "sont convertis en \ u0022

json_encode () prend deux arguments, la valeur et les options. Donc, essayez

json_encode($result, JSON_HEX_QUOT); // or
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS);

Je ne l'ai pas essayé cependant.

Désactiver magic_quotes_gpc php.ini .

php activer l'objet (PHP> = 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');

Si les échappements standard C sont ajoutés, puis JSON.parse vous permet de convertir des séquences comme \" en ", \\ dans \, \n dans une ligne d'alimentation, etc.

'foo\\bar\nbaz"' === JSON.parse('"foo\\\\bar\\nbaz\\""')

Dans le cas de notre projet:

""{\"lat\":28.4594965,\"lng\":77.0266383}"" de chaîne d'origine

Après avoir passé à JSON.parse()

"{"lat":28.4594965,"lng":77.0266383}"

2 e passer à JSON.parse()

{lat: 28.4594965, lng: 77.0266383}

Notez que JSON.parse() éliminé l'échappement des caractères au lieu de convertir string à object.

Après les caractères s'échappant ont été supprimés, la chaîne pour objet la conversion a travaillé.

Voici la démo:

while (typeof p1 != 'object') {
  p1 = JSON.parse(p1);
  pass++;
  console.log('On pass ', pass, p1);
}

Cela pourrait aider:

<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top