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()。
  具体使用方法如下
    var jsonstr = '{"name":"jifeng","company":"taobao"}';
    var evalJson = eval('(' + jsonstr + ')');//用eval()将字符串jsonstr解析成json
    var JSONParseJson = JSON.parse(jsonstr); //用JSON.parse将字符串jsonstr解析成json 
  既然两者都能达到解析json的结果,但这两者有什麽区别呢?我用以下的一个例子来进行说明:
 
  1. 用eval方法:
    var parse_json_by_eval = function(str){    
      return eval('('+str+')');
    }
    var value = 1;
    var jsonstr = '{"name":"jifeng","company":"taobao","value":++value}';
    var json1 = parse_json_by_eval(jsonstr);
    console.log(json1);
    console.log('value: '+ value);    
    执行结果:
    { name: 'jifeng', company: 'taobao', value: 2 }
    value: 2    
 
  2. 用JSON.parse方法
    var parse_json_by_JSON_parse = function(str){    
      return JSON.parse(str);
    }
    value = 1;
    var jsonstr = '{"name":"jifeng","company":"taobao","value":++value}';
    var 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的影响
  由于JSON对象是从字符串解析而来,因此在了解 '\' 对JSON影响之前,我们先来了解 '\' 对字符串的影响。这里特别要强调的是在javascript中 ' 和 " 在表示字符串时是等价,比如'a' = "a"
 
  众所周知,由于String数据类型包含转义字符,比如 '\n'表示换行,'\b'表示空格等,因此用表示 he say “hello” 这个字符串时,需要用 '\' 这个特殊字符来表示,即"he say \"hello \"" 。在chrome的中console.log()即可明显的看出。
 
  而JSON.parse()又是对字符串的真实含义进行解析,要表示 \ 必须要用"\\\\"表示:
 
  在json中出现'\'时,必须万分小心,这的确是json中最容易出错的地方
 
  在顺便提一个小插曲:当我知道在json解析时需要用"\\\\"时表示"\"时,你用JSON.parse('{"a":"a\\b"}'),竟然没有报错,难道我理解错了,细心的朋友应该看出来了,'\b'本身就是个转义字符,因此这里的第一个'\'是用来转义第二个'\' ,这样字符串就编程'a\b'('\b'是个转义字符),所以JSON.parse()还是可以顺利解析的。
 
  对这个概念还是有点绕的,读者需要多想想,自己当时也是花了较长的时间来想这个问题。

JSON.parse() 与 eval()的更多相关文章

  1. JSON.parse与eval的区别

    JSON.parse与eval和能将一个字符串解析成一个JSON对象,但还是有挺大区别. 测试代码 var A = "{ a: 1 , b : 'hello' }"; var B ...

  2. JSON.parse和eval的区别

    JSON.parse和eval的区别 JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Jav ...

  3. JSON.stringify()、JSON.parse()和eval(string)

    1.JSON.stringify()用于从一个对象解析出字符串,eg: var obj = {"name":"奔跑的蜗牛","age":&q ...

  4. 用JSON.parse和eval出现的问题

    json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢? JSON.parse()之可以解析json格式的数据,并且会对要解析 ...

  5. JSON.parse()和eval()的区别

    json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢? JSON.parse()之可以解析json格式的数据,并且会对要解析 ...

  6. JS中JSON.parse和eval的异同

    1.相同点 JSON.parse和eval函数都可将一段json字符串转换为json对象,如: var json = '{"intro":[{"name":&q ...

  7. JSON.parse与eval

    文章:JSON.parse 与 eval() 对于解析json的问题 json的标准格式:{"name":"jobs"}   名字和值都必须用双引号引起来.

  8. JSON.parse 与 eval() 对于解析json的问题

    1.eval()与JSOn.parse的不同 eval() var c = 1; //全局变量 var jsonstr1 = '{"name":"a",&quo ...

  9. JSON.parse()和eval()区别

    JSON.parse()只会将标准的Json字符串(key和value都由双引号引起来,最外面用单引号括住)转为JSON对象. eval()在转换字符串的时候是比较松的,即使不是标准的Json字符串也 ...

  10. Js中JSON.stringify()与JSON.parse()与eval()详解及使用案例

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.因为采用独立于语言的文本格式,也使用了类似于C语言家族的习惯,拥有了这些特性使使JSON称为理想的数据交换语 ...

随机推荐

  1. $Yeasion$的码风修改历程

    总之,今天是一个值得纪念的伟大日子,我将自己的码风进行了彻底的修改,大概是参考了Pks和\(Rqy\)的码风,分为以下几点. 1.变量名.在所有的计算符号之前和之后加空格.如:"&& ...

  2. Grunt中批量无损压缩图片插件--grunt-sprite

    这是什么 这是一个帮助前端开发工程师将css代码中的切片合并成雪碧图的工具,它的主要功能是: 使用二叉树排列算法,对css文件进行处理,收集切片序列,生成雪碧图 在原css代码中为切片添加backgr ...

  3. CSS3与页面布局学习总结(四)——页面布局的多种方法

    一.负边距与浮动布局   1.1.负边距 所谓的负边距就是margin取负值的情况,如margin:-100px,margin:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见的 ...

  4. python对文件进行读写操作

    转:http://sucre.iteye.com/blog/704077 ython进行文件读写的函数是open或file file_handler = open(filename,,mode) Ta ...

  5. iOS视频倒放

    iOS视频倒放 视频的倒放就是视频从后往前播放,这个只适应于视频图像,对声音来说倒放只是噪音,没什么意义,所以倒放的时候声音都是去除的. 倒放实现 一般对H264编码的视频进行解码,都是从头至尾进行的 ...

  6. BufPay.com 个人收款接口 接入步骤

    作为独立开发者产品需要收款是非常麻烦的,注册公司维护成本太高,市面上各种收款工具要么手续费太高,要么到账很慢,体验很不好. 看到 「BufPay.com 个人收款」 这个收款工具,挺有意思的.原理是监 ...

  7. string::size_type类型

    string::size_type类型 对于string中的size函数,size函数返回的是string对象的字符个数(长度),我们知道,对size()来说,返回一个int或者是一个unsigned ...

  8. ABAP术语-BAPI ExplorerSupertype

    Supertype 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/17/1109837.html Object type from whic ...

  9. Linux 实时查看进程网络的使用情况

    一行代码实现 linux 指定进程网络的使用情况 pid=4203;count=0;while true;do info2=`sed -n '4,100p' /proc/$pid/net/dev |a ...

  10. Virtualization state: Optimized (version 7.4 installed)

    [Virtualization state: Optimized (version 7.4 installed)] [root@localhost ~]# cd /mnt/ [root@localho ...