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

相关文章
相关标签/搜索