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"} 这就是标准形式。
JSON.parse 与 eval() 对于解析json的问题的更多相关文章
- JSON.parse与eval
文章:JSON.parse 与 eval() 对于解析json的问题 json的标准格式:{"name":"jobs"} 名字和值都必须用双引号引起来.
- JSON.parse和eval的区别
JSON.parse和eval的区别 JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Jav ...
- JSON.parse与eval的区别
JSON.parse与eval和能将一个字符串解析成一个JSON对象,但还是有挺大区别. 测试代码 var A = "{ a: 1 , b : 'hello' }"; var B ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...
- JSON.stringify()、JSON.parse()和eval(string)
1.JSON.stringify()用于从一个对象解析出字符串,eg: var obj = {"name":"奔跑的蜗牛","age":&q ...
- 用JSON.parse和eval出现的问题
json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢? JSON.parse()之可以解析json格式的数据,并且会对要解析 ...
- Js中JSON.stringify()与JSON.parse()与eval()详解及使用案例
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.因为采用独立于语言的文本格式,也使用了类似于C语言家族的习惯,拥有了这些特性使使JSON称为理想的数据交换语 ...
- JSON.parse()和eval()的区别
json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢? JSON.parse()之可以解析json格式的数据,并且会对要解析 ...
- JS中JSON.parse和eval的异同
1.相同点 JSON.parse和eval函数都可将一段json字符串转换为json对象,如: var json = '{"intro":[{"name":&q ...
随机推荐
- 一看就懂的ReactJs入门教程-精华版
现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领 ...
- 关于微软HttpClient使用,避免踩坑
最近公司对于WebApi的场景使用也越来越加大了,随之而来就是Api的客户端工具我们使用哪个?我们最常用的估计就是HttpClient,在微软类库中命名空间地址:System.Net.Http,是一个 ...
- 富文本编辑器Simditor的简易使用
最近打算自己做一个博客系统,并不打算使用帝国cms或者wordpress之类的做后台管理!自己处于学习阶段也就想把从前台到后台一起谢了.好了,废话不多说了,先来看看富文本编辑器SimDitor,这里是 ...
- 关于Android避免按钮重复点击事件
最近测试人员测试我们的APP的时候,喜欢快速点击某个按钮,出现一个页面出现多次,测试人员能不能禁止这样.我自己点击了几下,确实存在这个问题,也感觉用户体验不太好.于是乎后来我搜了下加一个方法放在我们U ...
- 普通程序员如何转向AI方向
眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智能方向,是知乎上的一个问题.本文是我对此问题的一个回答的归档版.相比原回答有所内容增加. 一. 目的 本文的目的是给出一个简单的,平 ...
- Discuz论坛黑链清理教程
本人亲测有效,原创文章哦~~~ 论坛黑链非常的麻烦,如果你的论坛有黑链,那么对不起,百度收录了你的黑链,不会自动删除,需要你手动去清理. 什么是黑链 黑链,顾名思义,就是一些赌博网站的外链,这些黑链相 ...
- C++ 事件驱动型银行排队模拟
最近重拾之前半途而废的C++,恰好看到了<C++ 实现银行排队服务模拟>,但是没有实验楼的会员,看不到具体的实现,正好用来作为练习. 模拟的是银行的排队叫号系统,所有顾客以先来后到的顺序在 ...
- StringUtils的isBlank与isEmply
1.public static boolean isEmpty(String str) 判断某字符串是否为空,为空的标准是 str==null 或 str.length()==0 StringUtil ...
- 设计模式C#合集--工厂方法模式
简单工厂,代码: public interface ISpeak { public void Say(); } public class Hello : ISpeak { public void Sa ...
- iOS -- CocoaPods
CocoaPods 是什么? CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具.CocoaPods 的项目源码在 GitHub( https://github.com/CocoaP ...