二重引用符で囲まれた json 解析エラー
-
09-09-2019 - |
質問
二重引用符はエスケープされていても解析エラーをスローします。
以下のコードを見てください
//parse the json in javascript
var testJson = '{"result": ["lunch", "\"Show\""] }';
var tags = JSON.parse(testJson);
alert (tags.result[1]);
これは、二重引用符 (すでにエスケープされている) が原因で解析エラーをスローします。
平 eval()
ここでは機能しません。
しかし、次のように二重スラッシュでエスケープすると、次のようになります。
var result = '{"result": ["lunch", "\\"Show\\""] }';
var tags = JSON.parse(result);
alert (tags.result[1]);
それならうまくいきます。
なぜここで JavaScript で二重スラッシュを使用する必要があるのでしょうか?問題はPHPです json_encode()
関数は二重引用符を単一のスラッシュでエスケープします (次のように: \"show\"
) どれの JSON.parse
解析できなくなります。この状況にどう対処すればよいでしょうか?
解決
さて、最後に、JSONの解析は、同じevalのを使用していますので、あなたは彼らになめらかを与えるに違いはありません。間違った構文を持ちます。この場合、あなたは、PHPで正しく引用符をエスケープする必要があり、その後、それらを脱出し、彼らのエスケープは、json_encodeとスラッシュ
<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo json_encode($json);
?>
OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"
このは(私はタイプミスをしていないしている場合)、クライアント側のJSで動作するはずです。
他のヒント
Javascriptがその文字列をアンエスケープし、JSONは同様にそれらをアンエスケープ。
最初の文字列('{"result": ["lunch", "\"Show\""] }'
)はJSONパーサーなどによって見られています
{"result": ["lunch", ""Show""] }
、JavaScriptで\"
が"
を意味するが、二重引用符で囲まれた文字列を終了していないので。
第2ストリング'{"result": ["lunch", "\\\"Show\\\""] }'
は、第{"result": ["lunch", "\"Show\""] }
するエスケープを解除されます(それは、JSONによって正しくエスケープです)。
私は'{"result": ["lunch", "\\"Show\\""] }'
があまりにも動作する必要があること、だと思います。
この問題は、2つ折りされた文字列のエスケープ機構によって引き起こされる:1は、JSから来て、一つはJSONから来ている。
。 別の次の文字が文字列内のそうでなければ表現できないの一文字]を表すために使用されると組み合わせるバックスラッシュ文字のの組み合わせ。 '' \\ '' は
'\' などの略このエスケープ機構はJSON.parse()作品の前に行われます。
たとえば、
var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}');
console.log(parsedObj.sentence);
>>>"It is one backslash(\)"
列生成の観点から、それはをJavaScriptの通訳に4つのバックラッシュの '\' を渡します。
は、JavaScriptの通訳者の観点から、それはintepretsの 2つのバックラッシュがあるの(\)として各 '\\' 配列が一つに '\' と解釈されます。
JSONパーサーの観点から、それのは、二つのバックラッシュの(\\)とJSON文字列エスケープ規則は、出力結果である1つの「\」としてそれを解析します。
受信しますもし最初のコードを説明
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]);
ドキュメントするから
すべての\ u0027
に変換されている 'に変換され
JSON_HEX_APOS
(整数) すべての "\ u0022JSON_HEX_QUOT
(整数)
json_encode()は、2つの引数、値及びオプションを取ります。そうしてみてください。
json_encode($result, JSON_HEX_QUOT); // or
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS);
私はこのかかわらを試していない。
消す magic_quotes_gpc
で php.ini.
javascriptオブジェクトにPHP(PHP> = 5.3.0)
var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');
標準の C エスケープを追加すると、 JSON.parse
次のようなシーケンスを変換します \"
の中へ "
, \\
の中へ \
, \n
改行などに。
'foo\\bar\nbaz"' === JSON.parse('"foo\\\\bar\\nbaz\\""')
私たちのプロジェクトの場合:
元の文字列 ""{\"lat\":28.4594965,\"lng\":77.0266383}""
に渡した後、 JSON.parse()
"{"lat":28.4594965,"lng":77.0266383}"
オン 2nd に渡します JSON.parse()
{lat: 28.4594965, lng: 77.0266383}
注目してください JSON.parse()
変換ではなくエスケープ文字を削除しました string
に object
.
エスケープ文字が削除された後、文字列からオブジェクトへの変換が機能するようになりました。
デモは次のとおりです。
while (typeof p1 != 'object') {
p1 = JSON.parse(p1);
pass++;
console.log('On pass ', pass, p1);
}
これは役立つかもしれません。
<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));