質問

二重引用符はエスケープされていても解析エラーをスローします。
以下のコードを見てください

//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(整数)   すべての "\ u0022

に変換されJSON_HEX_QUOT(整数)

json_encode()は、2つの引数、値及びオプションを取ります。そうしてみてください。

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

私はこのかかわらを試していない。

消す magic_quotes_gpcphp.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() 変換ではなくエスケープ文字を削除しました stringobject.

エスケープ文字が削除された後、文字列からオブジェクトへの変換が機能するようになりました。

デモは次のとおりです。

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));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top