JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式。同时,JSON是Javascript原生格式,这意味着在javascript中处理JSON数据不需要任何特殊的API或工具包,而且效率非常高。
JSON的结构如下:
- “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)
一个标准的json格式:
{"name":"jifeng","company":"taobao"}
总体而言,json是相对比较容易的理解和使用的,但同时存在很多的陷阱,如果不注意的话很容易掉进去,本文主要就是讲诉它容易让人犯错的地方。
一、json的的解析方法
json的解析方法共有两种:1. eval() ; 2.JSON.parse()。具体使用方法如下
jsonstr = ‘{"name":"jifeng","company":"taobao"}‘; evalJson = eval(‘(‘ + jsonstr + ‘)‘); JSONParseJson = JSON.parse(jsonstr);
既然两者都能达到解析json的结果,但这两者有什么区别呢?我用以下的一个例子来进行说明:
1. 用eval方法:
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解析代码会直接调用原生版本,如果没有原生支持的话,会调用一个略微不那么强大的非原生版本来处理。