JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析


Posted in Javascript onSeptember 05, 2017

 JSON 和XML比较

json的长度和xml比起来更加短小

json读取速度更快

json可以使用JavaScript的内置方法直接进行解析,转化成javascript对象,非常方便。

在Javascript使用eval将接送转化为json对象

var jsonData = '{"persons":{"name":"成龙","age":58},{"name":"吴京","age":33},"name":"甄子丹","age":44}';
var jsonObj = eval('('+jsonData+')');
//访问json对象数组的第一个对象的name属性
console.log(jsonObj.persons[0].name);

在Javascript使用JSON.parse将接送转化为json对象

var jsonData = '{"persons":{"name":"成龙","age":58},{"name":"吴京","age":33},"name":"甄子丹","age":44}';
var jsonObj = JSON.parse(jsonData);
//访问json对象数组的第一个对象的name属性
console.log(jsonObj.persons[0].name);

但是eval方法很不安全,例如:

var jsonData = '{"persons":{"name":"成龙","age":window.alert(123)},{"name":"吴京","age":33},"name":"甄子丹","age":44}';
var jsonObj = eval('('+jsonData+')');
//访问json对象数组的第一个对象的name属性
console.log(jsonObj.persons[0].name);

将age的值换成了Javascript代码,依然可以解析,加入有人恶意修改这个代码,那么就会造成严重后果。

但是JSON.parse不同

var jsonData = '{"persons":{"name":"成龙","age":window.alert(123)},{"name":"吴京","age":33},"name":"甄子丹","age":44}';
var jsonObj = JSON.parse(jsonData);
//访问json对象数组的第一个对象的name属性
console.log(jsonObj.persons[0].name);

浏览器会检查出json中的不合理的代码,并报告错误

所以推荐使用JSON.parse

PS:下面在单独介绍下eval()和JSON.parse()的区别

我们将一个字符串解析成json对象时可以使用两种方法:

假设我们有一个json格式的字符串:

'{
 "student" : [
  {"name":"鸣人","age":17}, 
  {"name":"小樱","age":17},
  {"name":"佐助","age":17}
 ]
}'

然后我们需要把它解析成json对象

1、eval()代码如下:

var data = '{"student" : [{"name":"鸣人","age":17}, {"name":"小樱","age":17},{"name":"佐助","age":17}]}';
eval('(' + data + ')');

2、JSON.parse()代码如下:

var data = '{"student" : [{"name":"鸣人","age":17}, {"name":"小樱","age":17},{"name":"佐助","age":17}]}';
JSON.parse(data);

区别:eval方法不会去检查给的字符串时候符合json的格式~同时如果给的字符串中存在js代码eval也会一并执行~比如如果上面的json格式的字符串改为:(注意红色部分)

var data = '{"student" : [{"name":"鸣人","age":17}, {"name":"小樱","age":alert("hehe")},{"name":"佐助","age":17}]}';

此时执行eval方法后会先弹出一个提示框输出hehe的字符串~

但是使用JSON.parse()就会报错~显示错误信息为当前字符串不符合json格式~即JSON.parse()方法会检查需要转换的字符串是否符合json格式~

相比较而言eval方法是很危险的~特别是当涉及到第三方时我们需要确保传给eval的参数是我们可以控制的~不然里面插入比如window.location~指向一个恶意的连接~那叫叫天啦

从这个层面讲~还是推荐使用JSON.parse来实现json格式字符串的解析

考虑到我们在制造json格式的字符串时极易出现错误~这里推荐一个json格式字符串的在线校验工具:http://jsonlint.com/

Javascript 相关文章推荐
JQuery的Alert消息框插件使用介绍
Oct 09 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
Sep 13 Javascript
红米手机抢购的js代码
Mar 10 Javascript
javascript 拷贝节点cloneNode()使用介绍
Apr 03 Javascript
jQuery多项选项卡的实现思路附样式及代码
Jun 03 Javascript
Javascript实现快速排序(Quicksort)的算法详解
Sep 06 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
Sep 25 Javascript
jquery.cookie实现的客户端购物车操作实例
Dec 24 Javascript
jQuery使用Layer弹出层插件闪退问题
Dec 22 Javascript
关于AngularJs数据的本地存储详解
Jan 20 Javascript
值得收藏的八个常用的js正则表达式
Oct 19 Javascript
如何用Node.js编写内存效率高的应用程序
Apr 30 Javascript
详解vue-cli本地环境API代理设置和解决跨域
Sep 05 #Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
Sep 05 #Javascript
浅谈Vue.js中的v-on(事件处理)
Sep 05 #Javascript
Angular实现下载安装包的功能代码分享
Sep 05 #Javascript
简单谈谈关于Angular Cli打包的事
Sep 05 #Javascript
Vue学习笔记之表单输入控件绑定
Sep 05 #Javascript
zTree异步加载展开第一级节点的实现方法
Sep 05 #Javascript
You might like
一个更简单的无限级分类菜单代码
2007/01/16 PHP
dedecms中常见问题修改方法总结
2007/03/21 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
微信支付开发订单查询实例
2016/07/12 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
JS的反射问题
2010/04/07 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
jquery的live使用注意事项
2014/02/18 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
Python中__call__用法实例
2014/08/29 Python
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
python如何爬取动态网站
2020/09/09 Python
.NET方向面试题
2014/11/20 面试题
房地产销售经理岗位职责
2014/01/01 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
个人租房协议书(范本)
2014/10/14 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书
《暗黑破坏神2:重制版》本周进行第一轮A测 目前可官网进行申请报名
2021/04/07 其他游戏
Python实现文字pdf转换图片pdf效果
2022/04/03 Python