Frage

Eine doppelte Anführungszeichen, wenn auch entgangen ist Parse-Fehler zu werfen.
Blick auf den Code unten

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

Dies wirft Parse-Fehler wegen der doppelten Anführungszeichen (die bereits entgangen sind).
Auch eval() wird hier nicht funktionieren.
Aber wenn ich entkommen sie mit doppelten Schrägstriche wie folgt aus:

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

dann funktioniert es gut.
Warum brauchen wir doppelten Schrägstrich hier in Javascript verwenden? Das Problem ist, dass PHP json_encode() Funktion doppelte Anführungszeichen mit einem einzigen Hieb entkommt (wie folgt aus: \"show\"), die JSON.parse wird analysieren nicht in der Lage sein. Wie kann ich mit dieser Situation umgehen?

War es hilfreich?

Lösung

Nun, endlich, JSON des Parse verwendet die gleiche eval, also gibt es keinen Unterschied, wenn man sie smth geben. mit falscher Syntax. In diesem Fall müssen Sie die korrekte Schreibweise Ihrer Anführungszeichen in PHP entkommen, und dann fliehen sie und ihre Entkommen schlitzt mit json_encode

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

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

Dieses auf Client-Seite JS funktionieren sollte (wenn ich keine Fehler gemacht habe).

Andere Tipps

Javascript demaskiert die Saiten und json demaskiert sie als gut. die erste Saite ('{"result": ["lunch", "\"Show\""] }') durch den Parser json gesehen als {"result": ["lunch", ""Show""] }, weil \" in Javascript bedeutet ", aber nicht die doppelten Anführungszeichen verlassen.

Die zweite Zeichenkette '{"result": ["lunch", "\\\"Show\\\""] }' wird unescaped zuerst {"result": ["lunch", "\"Show\""] } (und das ist richtig unescaped von json).

Ich denke, dass '{"result": ["lunch", "\\"Show\\""] }' sollte auch funktionieren.

Dieses Problem wird durch die zwei gefalteten Zeichenfolge zu entkommen Mechanismus verursacht wird: man kommt von JS und kommt von JSON

.

Eine Kombination aus der Zeichen Backslash mit einem anderen folgenden Zeichen kombiniert wird verwendet, um zu vertreten ein Zeichen , die sonst nicht darstellbare innerhalb des Strings. '' \\ '' steht für '\' usw.

Diese Flucht-Mechanismus erfolgt vor JSON.parse () funktioniert.

Beispiel:

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

Aus der Sicht des String-Generator, es geht vier Spielraümen '\' in den JavaScript interpretor.

Aus der Perspektive des JavaScript interpretor, es inteprets gibt es zwei Rückschlägen (\) als jeder '\\' Sequenz wird als eines interpretiert werden '\'.

Aus der Sicht des JSON-Parser, es erhält zwei Spielraümen (\\) und die JSON-String Escape-Regeln wird es analysiert als eine einzige '\', das ist das Ausgangsergebnis.

Erklären Sie zuerst den Code ein:

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]);

Von den docs

  

JSON_HEX_APOS (integer) Alle konvertiert 'zu \ u0027
  JSON_HEX_QUOT (integer) All "umgewandelt werden \ u0022

json_encode () nimmt zwei Argumente, den Wert und Optionen. So versuchen

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

Ich habe dies aber nicht versucht.

Schalten Sie magic_quotes_gpc in php.ini .

PHP JavaScript-Objekt (PHP> = 5.3.0)

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

Wenn die Standard-C-Fluchten hinzugefügt werden, dann wird JSON.parse Sequenzen umwandeln wie \" in ", \\ in \, \n in einen Zeilenvorschub, etc.

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

In unserem Projekt Fall:

Original-Zeichenkette ""{\"lat\":28.4594965,\"lng\":77.0266383}""

Nach dem Passieren zu JSON.parse()

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

Auf 2 nd passieren JSON.parse()

{lat: 28.4594965, lng: 77.0266383}

Beachten Sie, dass Zeichen anstelle der Umwandlung JSON.parse() string.

object entfernte Flucht

Nachdem die entweichenden Zeichen entfernt wurden, wird die Zeichenfolge gearbeitet, um das Objekt Konvertierung.

Hier ist die Demo:

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

Dies könnte helfen:

<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top