JSON在Javascript中的使用(eval和JSON.parse的區(qū)別)詳細(xì)解析
JSON 和XML比較
json的長度和xml比起來更加短小
json讀取速度更快
json可以使用JavaScript的內(nèi)置方法直接進(jìn)行解析,轉(zhuǎn)化成javascript對象,非常方便。
在Javascript使用eval將接送轉(zhuǎn)化為json對象
var jsonData = '{"persons":{"name":"成龍","age":58},{"name":"吳京","age":33},"name":"甄子丹","age":44}'; var jsonObj = eval('('+jsonData+')'); //訪問json對象數(shù)組的第一個對象的name屬性 console.log(jsonObj.persons[0].name);
在Javascript使用JSON.parse將接送轉(zhuǎn)化為json對象
var jsonData = '{"persons":{"name":"成龍","age":58},{"name":"吳京","age":33},"name":"甄子丹","age":44}'; var jsonObj = JSON.parse(jsonData); //訪問json對象數(shù)組的第一個對象的name屬性 console.log(jsonObj.persons[0].name);
但是eval方法很不安全,例如:
var jsonData = '{"persons":{"name":"成龍","age":window.alert(123)},{"name":"吳京","age":33},"name":"甄子丹","age":44}'; var jsonObj = eval('('+jsonData+')'); //訪問json對象數(shù)組的第一個對象的name屬性 console.log(jsonObj.persons[0].name);
將age的值換成了Javascript代碼,依然可以解析,加入有人惡意修改這個代碼,那么就會造成嚴(yán)重后果。
但是JSON.parse不同
var jsonData = '{"persons":{"name":"成龍","age":window.alert(123)},{"name":"吳京","age":33},"name":"甄子丹","age":44}'; var jsonObj = JSON.parse(jsonData); //訪問json對象數(shù)組的第一個對象的name屬性 console.log(jsonObj.persons[0].name);
瀏覽器會檢查出json中的不合理的代碼,并報(bào)告錯誤
所以推薦使用JSON.parse
PS:下面在單獨(dú)介紹下eval()和JSON.parse()的區(qū)別
我們將一個字符串解析成json對象時可以使用兩種方法:
假設(shè)我們有一個json格式的字符串:
'{ "student" : [ {"name":"鳴人","age":17}, {"name":"小櫻","age":17}, {"name":"佐助","age":17} ] }'
然后我們需要把它解析成json對象
1、eval()代碼如下:
var data = '{"student" : [{"name":"鳴人","age":17}, {"name":"小櫻","age":17},{"name":"佐助","age":17}]}'; eval('(' + data + ')');
2、JSON.parse()代碼如下:
var data = '{"student" : [{"name":"鳴人","age":17}, {"name":"小櫻","age":17},{"name":"佐助","age":17}]}'; JSON.parse(data);
區(qū)別:eval方法不會去檢查給的字符串時候符合json的格式~同時如果給的字符串中存在js代碼eval也會一并執(zhí)行~比如如果上面的json格式的字符串改為:(注意紅色部分)
var data = '{"student" : [{"name":"鳴人","age":17}, {"name":"小櫻","age":alert("hehe")},{"name":"佐助","age":17}]}';
此時執(zhí)行eval方法后會先彈出一個提示框輸出hehe的字符串~
但是使用JSON.parse()就會報(bào)錯~顯示錯誤信息為當(dāng)前字符串不符合json格式~即JSON.parse()方法會檢查需要轉(zhuǎn)換的字符串是否符合json格式~
相比較而言eval方法是很危險的~特別是當(dāng)涉及到第三方時我們需要確保傳給eval的參數(shù)是我們可以控制的~不然里面插入比如window.location~指向一個惡意的連接~那叫叫天啦
從這個層面講~還是推薦使用JSON.parse來實(shí)現(xiàn)json格式字符串的解析
考慮到我們在制造json格式的字符串時極易出現(xiàn)錯誤~這里推薦一個json格式字符串的在線校驗(yàn)工具:http://jsonlint.com/
相關(guān)文章
JavaScrip數(shù)組刪除特定元素的幾種方法總結(jié)
從js數(shù)組中刪除指定元素是我們每個人都遇到的問題,網(wǎng)上這方面的資料也很多,但有的時間過于久遠(yuǎn),有的內(nèi)容不夠全面,所以自己來整理下,這篇文章主要給大家總結(jié)介紹了關(guān)于JavaScrip數(shù)組刪除特定元素的多種方法,需要的朋友可以參考下。2017-09-09JS圖片預(yù)加載 JS實(shí)現(xiàn)圖片預(yù)加載應(yīng)用
由于圖片加載慢,導(dǎo)致用戶體驗(yàn)特別差,本文將介紹一種圖片預(yù)加載技術(shù),需要了解的朋友可以參考下2012-12-12JavaScript創(chuàng)建閉包的兩種方式的優(yōu)劣與區(qū)別分析
這篇文章主要介紹了JavaScript創(chuàng)建閉包的兩種方式的優(yōu)劣與區(qū)別分析的相關(guān)資料,需要的朋友可以參考下2015-06-06