2011-03-07 57 views
6

我有以下JSON字符串,PHP編碼5.2 json_encode():JSON.parse()來問題正則表達式值

{"foo":"\\."} 

這JSON字符串是有效的。您可以在http://www.jsonlint.com/

檢查出來,但本機JSON.parse()來的方法(瀏覽器,火狐),引發以下錯誤,在解析:

SyntaxError: Unexpected token ILLEGAL 

請問你知道,任何人的,爲什麼我不能解析轉義正則表達式元字符?

這個例子的工作原理:

{"foo":"\\bar"} 

但是這其中也失敗:

{"foo":"\\?"} 

BTW:\.僅僅是一個簡單的測試正則表達式,我想通過javascript的RegExp對象運行。

感謝您的支持,

Dyvor

+3

它適用於「{」foo「:」\\\\?「}''。所以看起來你必須「雙重逃離」角色。 ''{「foo」:「\\ bar」}'** **似乎**可以工作(它不會拋出錯誤),但結果將是'{foo:「ar」}'。 –

回答

9

它的「不工作」,因爲你錯過了一個關鍵點:有解析字符串中去,當你鍵入到瀏覽器控制檯像行:

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

第一串當JavaScript解析器解析傳遞給「parse()」方法的字符串常量時,會發生解析。 字符串解析發生在JSON解析器本身內部。第一遍之後,雙反斜槓只是一個反斜槓。

這一個:

{"foo":"\\bar"} 

作品,因爲 「\ B」 是一個有效的串內轉義序列。

+0

+1我要寫些類似的東西...... –

+0

+1 Pointy的右邊 var test = {「foo」:「\\ bar」}; alert(JSON.stringify(test)); //提醒'{「foo」:「\\ bar」}'; var test2 ='{「foo」:「\\ bar」}'; alert(JSON.stringify(JSON.parse(test2))); //提醒'{「foo」:「\ bar」}'; – DefyGravity

+1

@DefyGravity我不明白你在那裏得到什麼。 - 哦好的 :-) – Pointy

0

添加一組額外的\\的,至於爲什麼它的作品我不太確定。

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

它可以工作,因爲有兩種解析發生:將字符串常量的JavaScript解析編碼到函數調用表達式中,然後對結果字符串進行JSON解析。 – Pointy

1

它適用於我在螢火蟲控制檯。

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

作爲JSON分析器實際接收"\\.",即一個esacped反斜線和點,其是正確的。

這個問題是否真的發生在你的PHP響應中?或者只是在「手動」測試中?