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"} 这就是标准形式。

时间: 2024-10-13 10:22:36

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

javascript中JSON.parse()与eval()解析json的区别

varjsonData='{"data1":"Hello,","data2":"world!"}' 调用方法jsonData.data1,jsonData.data2 jsonData=[  {"name":"LiLei","age":19,"sex":"male"}, {"name":"HanMe

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

json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢? JSON.parse()之可以解析json格式的数据,并且会对要解析的字符串进行格式检查,如果格式不正确则不进行解析,而eval()则可以解析任何字符串,eval是不安全的. 比如下面的字符串: var str = 'alert(1000.toString())'; eval(str); JSON.parse(str); 用eval可以解析,并且会弹出对话框,而用J

JSON.parse与eval的区别

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

JSON.parse和eval的区别

JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Javascript原生格式,这意味着在javascript中处理JSON数据不需要任何特殊的API或工具包,而且效率非常高. 基本格式:varjsonData='{"data1":"Hello,","data2":"world!"}' 调用方法jsonData.data1

JSON.parse和eval的区别(转)

这几天刚好看到这里,记下来 JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Javascript原生格式,这意味着在javascript中处理JSON数据不需要任何特殊的API或工具包,而且效率非常高. 基本格式:varjsonData='{"data1":"Hello,","data2":"world!"}' 调用方法

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

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.因为采用独立于语言的文本格式,也使用了类似于C语言家族的习惯,拥有了这些特性使使JSON称为理想的数据交换语言,作用是易于阅读和编写,同时也易于机器解析和生成(一般用于网络传输速率). 一:JSON.parse(); 作用:将json字符串转换成json对象 语法:JSON. parse(text[,reviver]). 参数: text:必选,一个有效的json字符串. reviver:可选. 返回值:

eval函数解析json表达式

Eval函数解析 *********************** ps:JSON(JavaScript Object Notation,JavaScript对象表示法)是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量. json只支持三种的数据类型: 简单值,数组,字符串,布尔,或者null,但不支持undifine 基本的格式: 对象:键值 "name":"Yumay",|| "age": 18, ||"sex":&

JSON.parse()与eval()

一.前言 和 XML 一样,JSON 也是基于纯文本的数据格式.由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象. 二.包含json对象的字符串 基本格式:var jsonData='{"data1":"Hello,","data2":"world!"

使用javascript的eval函数解析json字符串,提示“not avalible”怎么办?

按照最简单的形式,可以用下面这样的 JSON 表示"名称 / 值对": var jsonString = '{ "firstName": "Brett" } '; 如果这样的简单json字符串使用eval函数是不能解析(在chrome浏览器37.0中测试)的 var a = eval(jsonString); 执行这个语句是系统会提示:“not avalible”; 这样的问题怎么办呢,我们实际中确实需要传输多个参数的值. 解决的办法是将最简单的