JSON字符串的解析

    JSON(JavaScript Object Notation)是一種輕量級的數據格式,採用徹底獨立於語言的文本格式,是理想的數據交換格式。同時,JSON是Javascript原生格式,這意味着在javascript中處理JSON數據不須要任何特殊的API或工具包,並且效率很是高。javascript

     JSON的結構以下:html

  • 「名稱/值」對的集合(A collection of name/value pairs)。不一樣的語言中,它被理解爲對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。java

  • 值的有序列表(An ordered list of values)。在大部分語言中,它被理解爲數組(array)json

      一個標準的json格式:數組

{"name":"jifeng","company":"taobao"}

      整體而言,json是相對比較容易的理解和使用的,但同時存在不少的陷阱,若是不注意的話很容易掉進去,本文主要就是講訴它容易讓人犯錯的地方。函數

 

      1、json的的解析方法工具

      json的解析方法共有兩種:1. eval() ; 2.JSON.parse()。具體使用方法以下性能

 jsonstr = '{"name":"jifeng","company":"taobao"}';
 evalJson = eval('(' + jsonstr + ')');
 JSONParseJson = JSON.parse(jsonstr);

   

    既然二者都能達到解析json的結果,但這二者有什麼區別呢?我用如下的一個例子來進行說明:spa

    1. 用eval方法:code

複製代碼

 parse_json_by_eval = (str){
     eval('('+str+')');
}

 value = 1;
 jsonstr = '{"name":"jifeng","company":"taobao","value":++value}';
 json1 = parse_json_by_eval(jsonstr);
console.log(json1);
console.log('value: '+ value);

複製代碼

    執行結果:

{ name: 'jifeng', company: 'taobao', value: 2 }
value: 2

    2. 用JSON.parse方法

複製代碼

 parse_json_by_JSON_parse = (str){
     JSON.parse(str);
}

value = 1;
 jsonstr = '{"name":"jifeng","company":"taobao","value":++value}';
 json2 = parse_json_by_JSON_parse(jsonstr);
console.log(json2);
console.log(value);

複製代碼

     執行結果:

     不能順利執行,報錯

 前者能順利執行,並修改了全局變量value的值,然後者報錯了。從上例就能夠明顯地看出,eval在解析字符串時,會執行該字符串中的代碼(這樣的後果是至關惡劣的),如上例中,因爲用eval解析一個json字符串而形成原先的value的值改變。《高性能Javascript》一書即指出:

警告:關於JSON和eval須要注意的是:在代碼中使用eval是很危險的,特別是用它執行第三方的JSON數據(其中可能包含惡意代碼)時,儘量使用JSON.parse()方法解析字符串自己。該方法能夠捕捉JSON中的語法錯誤,並容許你傳入一個函數,用來過濾或轉換解析結果。若是此方法以備Firfox 3.5 、IE8 及 Safari 4 原生支持。大多數javascript類庫包含的JSON解析代碼會直接調用原生版本,若是沒有原生支持的話,會調用一個略微不那麼強大的非原生版原本處理。

相關文章
相關標籤/搜索