2011-03-07 9 views
6

値。あなたはhttp://www.jsonlint.com/JSON.parse()の問題は、私はPHP 5.2 json_encode()でエンコードされた以下のJSON文字列を、持っている

でそれをチェックアウトすることができます。しかし解析中にネイティブJSON.parse()メソッド(クローム、Firefoxは)、次のエラーがスローされます:なぜ私はできません

SyntaxError: Unexpected token ILLEGAL 

は、あなたの誰もが知っていますエスケープされた正規表現のメタ文字を解析しますか?

この例では動作します:

{"foo":"\\bar"} 

をしかし、この1つはまた失敗:ところで

{"foo":"\\?"} 

\.は、私はジャバスクリプトのRegExpオブジェクトを経由して実行するだけの簡単なテストの正規表現、です。私は正確にわからないんだけど、それが機能する理由としてご支援

おかげで、

Dyvor

+3

これは ''{" foo ":" \\\\? "}''で動作します。だから、あなたは文字を "二重にエスケープ"しなければならないようです。 '' {"foo": "\\ bar"} ''**は**動作するように見えますが(エラーは発生しません)、結果は' {foo: "ar"} 'になります。 –

答えて

9

:ある文字列解析し、あなたはクロームコンソールに同様の行を入力するときに行く:

JSON.parse('{"foo": "\\."}'); 

最初文字列を構文解析は、JavaScriptインタプリタが "parse()"メソッドに渡す文字列定数を解析するときに発生します。 第2の文字列解析は、JSONパーサ自体の内部で行われます。最初のパスの後、二重バックスラッシュは単なるバックスラッシュです。この1

{"foo":"\\bar"} 

作品 "\ bは" 有効内の文字列エスケープシーケンスであるため。

+0

+1私は似たようなものを書くつもりだった... –

+0

+1 Pointy's right var test = {"foo": "\\ bar"}; アラート(JSON.stringify(test)); //アラート '{"foo": "\\ bar"}'; var test2 = '{"foo": "\\ bar"}'; アラート(JSON.stringify(JSON.parse(test2))); //アラート '{"foo": "\ bar"}'; – DefyGravity

+1

@DefyGravity私はあなたが何を得ているのか分かりません。 - ああ、OK :-) – Pointy

0

は、\\の余分なセットを追加します。

JSON.parse('{"foo":"\\\\."}'); 
+0

これは、関数呼び出し式にコード化された文字列定数のJavaScript解析と結果の文字列のJSON解析の2つの解析が行われているために機能します。 – Pointy

1

それは放火魔コンソールで私のために動作します。 JSONパーサーは、実際すなわちesacpedバックスラッシュドット、"\\."受け取るように正しい

>>> JSON.parse('"\\\\."'); 
"\." 

PHPからの応答で実際に問題が発生しましたか?または単に「手動」テストを行っていますか?

あなたがキーポイントを逃しているので、それが「機能していない」だ
関連する問題