json Parse-Fehler mit doppelten Anführungszeichen
-
09-09-2019 - |
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?
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));