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解析代碼會直接調用原生版本,若是沒有原生支持的話,會調用一個略微不那麼強大的非原生版原本處理。