今天做項目的時候,使用JSON.parse轉換字符串成json數據的時候遇到了一個問題,
舉例如下:
1 var jsonStr = '{"sex":"男","info":"我\\是好人"}'; 2 JSON.parse(jsonStr);
運行結果如下:
jsonStr里有兩個反斜杠存在,JSON.parse在執行的時候則報錯了,我們用eval來執行自然是不會報錯的,運行結果如下:
我們再來看一下下面這三行代碼:
1 var jsonStr1 = '{sex:"男",info:"我是好人"}'; 2 var jsonStr2 = "{'sex':'男','info':'我是好人'}"; 3 var jsonStr3 = '{"sex":"男","info":"我是好人"}';
運行結果如下:
從運行結果可以看出:只有jsonStr3這種格式的json串JSON.parse才可以正確轉換,用eval來處理自然是沒有問題的,運行結果如下:
總結
JSON.parse是ES5提出的規范,兼容視圖如下:(url:http://kangax.github.io/es5-compat-table/)
JSON在ie中從ie8開始兼容,其他類型瀏覽器則幾乎全部兼容,JSON api使用的門檻也變低了,多數瀏覽器可以直接使用,
一些json處理的第三方js插件也多數基於JSON原生api,個人認為jsonStr1,jsonStr2,jsonStr3這三種格式只有jsonStr3才能正確執行
應該是JSON對json串的格式要求比較嚴格,比較規范;至於json串如果有兩個反斜杠則報錯,則不能理解。
至於JSON.parse和eval的區別及利弊則引用《高性能Javascript》書中的一句話:
警告:關於JSON和eval需要注意的是:在代碼中使用eval是很危險的,特別是用它執行第三方的JSON數據(其中可能包含惡意代碼)時,
盡可能使用JSON.parse()方法解析字符串本身。該方法可以捕捉JSON中的語法錯誤,並允許你傳入一個函數,用來過濾或轉換解析結果。
如果此方法以備Firfox 3.5 、IE8 及 Safari 4 原生支持。大多數javascript類庫包含的JSON解析代碼會直接調用原生版本,
如果沒有原生支持的話,會調用一個略微不那么強大的非原生版本來處理。
如有錯誤,歡迎指出,歡迎補充。