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 = '{ "a" : 1 , "b" : "hello" }';
var F = '{ "a" : 1 ,\n "b" : "hello" }';
var G = '{ "a" : 1 , "b" : window.location.href="https://www.baidu.com" }';
JSON.parse执行:
例:JSON.parse(A);
A、B、C、G都不可转,D、E、F都可以。
eval执行:
例:eval("("+A+")");
A到G都可以转,特别到G时,页面还跳转到百度了。
JSON.parse
上面的演示例子可以看出,这方法只能解析属性名是双引号包裹的字符串对象,并会忽略换行和空格(值外面)。
但是,从MDN对JSON的描述,能解析的JSON字符串的条件完整如下:
| JavaScript类型 | JSON与之区别 |
| 对象和数组 |
属性名称必须用双引号包裹;
最后一个属性后面不能有逗号。
|
| 数值 |
前导0不能使用(在 JSON.stringify 中将会被忽略,在 JSON.parse 会抛出错误);
小数点后面至少有一个数字。
|
| 字符串 |
只有有限的字符能够被转义;
不允许某些控制字符;但允许使用Unicode 行分隔符 (U+2028) 和段落分隔符 (U+2029) ;
字符串必须用双引号括起来。
|
这方法还可以捕捉JSON中的语法错误,并允许你传入一个函数,用来过滤或转换解析结果。
浏览器兼容:IE8+
eval
eval函数可将一个JavaScript代码字符串求值成特定的对象,所以解析成JSON对象只不过是作用之一。
为什么eval()解析JSON字符串要加上括号?
原因是两点:
1. json对象是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理。
2. 加上圆括号为了处理字符串为表达式,而不是语句(statement)来执行。
例子:
对象字面量 {},不加外层的括号,那么eval会识别为JS代码块的开始和结束标记,那么 {} 将会被认为是执行了一句空语句。
alert(eval("{}")); // return undefined
alert(eval("({})"));// return object[Object]
不建议使用
虽然从演示例子看,eval的能力是强过于JSON.parse的,它可解析不规范的JSON字符串,但是G的例子也可以看出,eval是不安全的,特别是数据是第三方给予时候,你根本不知道eval之后它会干什么。
所以结论就是,乖乖用JSON.parse解析JSON对象。
$.parseJSON
jQuery也有提供解析JSON字符串的方法,$.parseJSON ,就目前jQuery版本来讲,分为两类。
2.x和3.x版本: $.parseJSON 都是直接使用 JSON.parse 的。
1.x版本:浏览器支持 JSON.parse 就用这个,不支持就进行校验,确认是JSON字符串,则用
( Function( "return " + str ) )()
返回对象,否则返回无效JSON对象error。
PS:之所以能用Function处理,前提是校验确认为JSON字符串,不然还是不安全的转换方法。
总结
eval是强烈不建议用来解析JSON字符串,但是凡事无绝对,如果数据来源于你信任的并且格式也不大规范,那用它也不是不可以。
参考文献
1. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON
2. https://code.jquery.com/jquery-1.12.4.js
本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。
JSON.parse与eval的区别的更多相关文章
- JSON.parse和eval的区别
JSON.parse和eval的区别 JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Jav ...
- JSON.parse()和eval()的区别
json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢? JSON.parse()之可以解析json格式的数据,并且会对要解析 ...
- javascript JSON.parse和eval的区别
SON.parse()用来将标准json字符串转换成js对象:eval()除了可以将json字符串(非标准的也可以,没有JSON.parse()要求严格)转换成js对象外还能用来动态执行js代码.例如 ...
- JSON.parse和eval()的区别
eval方法不检查给的字符串是否符合json的格式,parse会检查json语法格式. 比如一个json字符串data: { "a": 1, "b": &quo ...
- 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.parse和eval的异同
1.相同点 JSON.parse和eval函数都可将一段json字符串转换为json对象,如: var json = '{"intro":[{"name":&q ...
- JSON.parse与eval
文章:JSON.parse 与 eval() 对于解析json的问题 json的标准格式:{"name":"jobs"} 名字和值都必须用双引号引起来.
- JSON.parse()和eval()区别
JSON.parse()只会将标准的Json字符串(key和value都由双引号引起来,最外面用单引号括住)转为JSON对象. eval()在转换字符串的时候是比较松的,即使不是标准的Json字符串也 ...
随机推荐
- 「译」JUnit 5 系列:环境搭建
原文地址:http://blog.codefx.org/libraries/junit-5-setup/ 原文日期:15, Feb, 2016 译文首发:Linesh 的博客:环境搭建 我的 Gith ...
- 敏捷转型历程 - Sprint3 一团糟的演示会
我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...
- Oracle使用触发器和mysql中使用触发器的比较——学习笔记
一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...
- GCC学习(1)之MinGW使用
GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...
- ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写
主要更新: 1:增加AR.Global.GetUser() 方法返回当前登陆者的用户信息. 2:重写AR.Combobox 支持下拉树. 3:调整及扩展Input下拉的配置参数. 4:优化及新增AR. ...
- 跨平台的 .NET 运行环境 Mono 3.2 新特性
Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新. Mono 3.2 主要新特性: LLVM 更新到 3.2 版本,带来更多 ...
- egret GUI 和 egret Wing 是我看到h5 最渣的设计
一个抄袭FlexLite抄的连自己思想都没有,别人精髓都不懂的垃圾框架.也不学学MornUI,好歹有点自己想法. 先来个最小可用集合吧: 1. egret create legogame --type ...
- Entity Framework 6 Recipes 2nd Edition(13-1)译 -> 优化TPT继承模型的查询
问题 你想提高在一个TPT继承模型里的查询 解决方案 让我们假设有一个简单的TPT继承模型,如图Figure 13-1 Figure 13-1. A simple Table per Type inh ...
- java中判断list是否为空的用法
1.如果想判断list是否为空,可以这么判断: if(null == list || list.size() ==0 ){ //为空的情况 }else{ //不为空的情况 } 2.list.isEmp ...
- iOS----应用的旋转---Orientations
此博文主要针对IOS应用, 是屏幕旋转相关问题的一个总结. 主要内容有: IOS5,6,7不同版的适配. 强制旋转和自动旋转. QQ : 1101819159 邮箱: GeekiVan@aliyun. ...