首页 > 代码库 > JSON字符串的解析

JSON字符串的解析

    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解析代码会直接调用原生版本,如果没有原生支持的话,会调用一个略微不那么强大的非原生版本来处理。

JSON字符串的解析