天天看點

JSON.parse和eval的差別

JSON(JavaScript Object Notation)是一種輕量級的資料格式,采用完全獨立于語言的文
本格式,是理想的資料交換格式。同時,JSON是Javascript原生格式,這意味着
在javascript中處理JSON資料不需要任何特殊的API或工具包,而且效率非常高。
           

 基本格式:

varjsonData='{"data1":"Hello,","data2":"world!"}'
           
//使用方法
console.log(jsonData.data1);//列印結果為Hello
console.log(jsonData.data2);//列印結果為world!
           

很多json資料存入數組 

var jsonData=[

    {"name":"LiLei","age":19,"sex":"male"},

    {"name":"HanMei","age":18,"sex":"famale"}

];
           

調用方法jsonData[0].name,jsonData[1].sex

總體而言,json是相對比較容易的了解和使用的,但同時存在很多的陷阱,如果不注意的話很容易掉進去。

json的的解析方法

json的解析方法共有兩種:eval_r() 和 JSON.parse(),使用方法如下:

var jsonData = '{"data1":"Hello,", "data2":"world!}';
           
var evalJson=eval_r('('+jsonData+')');
           
var jsonParseJson=JSON.parse(jsonData);
           
這樣就把jsonData這個json格式的字元串轉換成了JSON對象。
           
二者的差別如下:
           
var value = 1;
           
var jsonstr = '{"data1":"hello","data2":++value}';
           
var data1 = eval_r('('+jsonstr+')');
           
console.log(data1);//這時value值為2
           
var data2=JSON.parse(jsonstr);
           
console.log(data2);//報錯
           
可以看到控制輸出台的結果,第一個eval_r()順利執行,第二個報
錯了。從上例就可以明顯地看出,eval在解析字元串時,會執行該字
符串中的代碼(這樣的後果是相當惡劣的),如上例中,由于用eval解
析一個json字元串而造成原先的value的值改變。
           
《高性能Javascript》一書即指出:
警告:關于JSON和eval需要注意的是:在代碼中使用eval是很危險的,特别是用它執
行第三方的JSON資料(其中可能包含惡意代碼)時,盡可能使用JSON.parse()方法解
析字元串本身。該方法可以捕捉JSON中的文法錯誤,并允許你傳入一個函數,用來過
濾或轉換解析結果。如果此方法以備Firfox 3.5 、IE8 及 Safari 4 原生支援。大
多數javascript類庫包含的JSON解析代碼會直接調用原生版本,如果沒有原生支
持的話,會調用一個略微不那麼強大的非原生版本來處理。
           

繼續閱讀