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

1.eval()与JSOn.parse的不同

eval()

    var c = 1; //全局变量

    var jsonstr1 = '{"name":"a","company":"b","value":++c}';

    var json1 = eval('(' + jsonstr1 + ')');

    console.log(json1.value);
  

c是全局变量为1,但是经过eval的解析,全局变量变成了2!(这样的写法是危险的)

 

JSON.parse

    var c = 1; //全局变量

    var jsonstr1 = '{"name":"a","company":"b","value":++c}';

    var json2 = JSON.parse(jsonstr1);

    console.log(json2.value);
  

IE下报错:

谷歌下报错:

而JSON.parse则会报错。

 

2.在++c中加上双引号则就可以,因为它变成字符串了。

 

 var c = 1; //全局变量

    var jsonstr1 = '{"name":"a","company":"b","value":“++c”}';

    var json2 = JSON.parse(jsonstr1);

    console.log(json2.value);

 

结果:

 

3.我想很多人在纠结双引号的问题,这里我们就来集中测试下。

   a:JSON.parse

var c = 1; //全局变量
    var date = new Date();
    console.log(date.toLocaleDateString());
    //var jsonstr1 = '{"name":"a","company":"b","value":"++c"}';//键,值都有双引号
    var jsonstr2 = '{"name":"a","company":"b","value":++c}';//仅++c上午双引号
    //var jsonstr3 = '{name:"a",company:"b",value:"++c"}';//仅有值上有双引号
    //var jsonstr4 = '{name:a,company:b,value:++c}';//全无双引号

    //var json1 = JSON.parse(jsonstr1);
    var json2 = JSON.parse(jsonstr2);
    //var json3 = JSON.parse(jsonstr3);
    //var json4 = JSON.parse(jsonstr4);

    //console.log(json1 );
    console.log(json2 );
    //console.log(json3);
    //console.log(json4);

结果依次为:

可见JSON.parse中只有第一种标准形式才会解析正确

 

b:eval()

var c = 1; //全局变量
    var date = new Date();
    console.log(date.toLocaleDateString());

    var jsonstr1 = '{"name":"a","company":"b","value":"++c"}';//键,值都有双引号
    //var jsonstr2 = '{"name":"a","company":"b","value":++c}';//仅++c上午双引号
    //var jsonstr3 = '{name:"a",company:"b",value:"++c"}';//仅有值上有双引号
    //var jsonstr4 = '{name:a,company:b,value:++c}';//全无双引号

    var json1 = eval('('+jsonstr1+')');
    //var json2 = eval('('+jsonstr2+')');
    //var json3 = eval('('+jsonstr3+')');
    //var json4 = eval('('+jsonstr4+')');

    console.log(json1+"    "+json1.value );
    //console.log(json2+"    "+json2.value );
    //console.log(json3 + "    " + json3.value);
    //console.log(json4+"    "+json3.value);

 

结果依次为:

而eval中除了最后一种,其他都解析正确。

 

4.这时候还有一个问题:那就是为什么eval()解析的时候要加上括号?

我们先看看不加括号会怎么样:

var c = 1; //全局变量
    var date = new Date();
    console.log(date.toLocaleDateString());

    var jsonstr1 = '{"name":"a","company":"b","value":"++c"}';//键,值都有双引号

    var json1 = eval(jsonstr1);

    console.log(json1+"    "+json1.value );

结果:

这里不加就出错了。

那是因为eval()相当于一个执行环境,当你不加括号的时候,jsonstr1会被认为是一条复合语句。运行的时候就会逐个字符的解析。

但是加上括号的时候,jsonstr1就当做一个表达式去运算。从括号开始就被当做了对象进行识别。

 


5.然后你又会想到,那这个括号为什么要加“()”,不能加“{}”么?

答案是:当然能加“{}”,只不过就会报错而已~。— —!

这时候你要明吧json的格式是什么!

{"name":"a","company":"b"} 这就是标准形式。

转载:http://www.cnblogs.com/zqzjs/p/4693958.html

时间: 2016-05-20

JSON.parse 与 eval() 对于解析json的问题的相关文章

JS中Json数据的处理和解析JSON数据的方法详解_javascript技巧

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). JSON的规则很简单: 对象是一个无序的"'名称/值'对"集合.一个对象以&quo

json-ajax中eval()JSON.parse()parseJSON()和evalJSON()?

问题描述 ajax中eval()JSON.parse()parseJSON()和evalJSON()? 求解这几个方法的区别ajax中eval().JSON.parse().parseJSON()和evalJSON()的区别? 其中eval().JSON.parse()不用导入js文件 parseJSON()需要json.js文件 evalJSON()需要prototype.js文件 这几个中是不是evalJSON()最常用啊? 解决方案 json本身也是可以运行的js代码.所以可以调用eval

js使用eval解析json实例与注意事项分享

 eval函数在js中有不少用处了,下面我来给各位朋友介绍eval解析json的实例,基于这个实例我们引出来在eval处理json数据时的一些注意事项,希望文章对各位同学会有所帮助 JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包. JSON的规则很简单: 对象是一个无序的"'名称/值'对"集合.

js使用eval解析json实例与注意事项分享_javascript技巧

JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包.JSON的规则很简单: 对象是一个无序的"'名称/值'对"集合.一个对象以"{"(左括号)开始,"}"(右括号)结束.每个"名称"后跟一个":"(冒号):"'

做项目时使用JSON.parse遇到的问题

今天做项目的时候,使用JSON.parse转换字符串成json数据的时候遇到了一个问题, 举例如下: 1 var jsonStr = '{"sex":"男","info":"我\\是好人"}'; 2 JSON.parse(jsonStr); 运行结果如下:   jsonStr里有两个反斜杠存在,JSON.parse在执行的时候则报错了,我们用eval来执行自然是不会报错的,运行结果如下: 我们再来看一下下面这三行代码: 1 v

解析JSON对象与字符串之间的相互转换

 本篇文章主要是对JSON对象与字符串之间的相互转换进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 在开发的过程中,如果对于少量参数的前后台传递,可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,这样后台   接受的时候Request多个很麻烦,此时要按照类的格式或者 集合的形式进行传递.     例如:前台按类的格式传递JSON对象:   var jsonUserInfo = "{"TUserName&quo

js jquery前台解析json字符串

一.js解析json字符串 eval()和JSON.parse() 对于服务器返回的JSON字符串,如果jquery异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,就是将该字符串放于eval()中执行一次.这种方式也适合以普通javascipt方式获取json对象,以下举例说明: var dataObj=eval("("+data+")");//转换为json对象 为什么eval这里要添加 "("+data+")&

解析JSON对象与字符串之间的相互转换_jquery

在开发的过程中,如果对于少量参数的前后台传递,可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,这样后台 接受的时候Request多个很麻烦,此时要按照类的格式或者 集合的形式进行传递. 例如:前台按类的格式传递JSON对象: var jsonUserInfo = "{\"TUserName\":\"" + userName + "\",\"TInterest\&qu

jQuery解析Json实例详解_jquery

本文实例讲述了jQuery解析Json的方法.分享给大家供大家参考,具体如下: 前言 在WEB数据传输过程中,json是以文本,即字符串的轻量级形式传递的,而客户端一般用JS操作的是接收到的JSON对象,所以,JSON对象和JSON字符串之间的相互转换.JSON数据的解析是关键. 先明确2个概念例如: JSON字符串: 复制代码 代码如下: var str1 = '{ "name": "deyuyi", "sex": "man"