关键词:
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中eval与parse的区别
json的的解析方法 (非原创)json的解析方法共有两种:eval_r()和JSON.parse(),使用方法如下:varjsonData=‘{"data1":"Hello,", "data2":"world!}‘;varevalJson=eval_r(‘(‘+jsonData+‘)‘);varjsonParseJson=JSON.parse(jsonData);这样就把js 查看详情
javascript中json.parse()与eval()解析json的区别
varjsonData=‘{"data1":"Hello,","data2":"world!"}‘调用方法jsonData.data1,jsonData.data2 jsonData=[ {"name":"LiLei","age":19,"sex":"male"}, {"name":"HanMei","age":18,"sex":" 查看详情
json.parse()和eval()的区别
...用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢?JSON.parse()之可以解析json格式的数据,并且会对要解析的字符串进行格式检查,如果格式不正确则不进行解析,而eval()则可以解析任何字符串,eval是不安全的。比... 查看详情
js数组使用json.stringify和tostring的区别
js中eval()和$.parseJSON()的区别以及JSON.stringify()1.第一个区别是:安全性json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢?JSON.parse()之可以解析json格式的数据,并且会对要解... 查看详情
json与string之间互转
...,String转json这个JSON.parse()与eval()都可以实现,但是它们是有区别的,JSON.parse对json字符串要求比eval()更为严格,key名称(例如name)全部必须有双引号。而eval必须用括号将json字符串括起来才能成功转换,key名称(例如name)有无双引号都可以... 查看详情
js中json.stringify()与json.parse()与eval()详解及使用案例
...机器解析和生成(一般用于网络传输速率)。 (1)JSON.parse函数 作用:将json字符串转换成json对象。语法:JSON.&n 查看详情
js中解析json时候的eval和$.parsejson()的区别以及json.stringify()
1.第一个区别是:安全性 json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢? JSON.parse()之可以解析json格式的数据,并且会对要解析的字符串... 查看详情
javascript中eval()和$.parsejson()的区别和联系以及json.stringify()的区别(代码片段)
JavaScript中eval()和$.parseJSON()的区别和联系以及JSON.stringify()的区别一、第一个区别是:安全性json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢?JSON.parse()之... 查看详情
json.parse()与json.stringify()的区别
JSON.parse()与JSON.stringify()的区别JSON.parse()【从一个字符串中解析出json对象】例子://定义一个字符串vardata=‘{"name":"goatling"}‘//解析对象??JSON.parse(data)结果是:?name:"goatling"JSON.stringify()【从一个对象中解析出字符串】vardata={name:‘go... 查看详情
json.parse()与json.stringify()的区别
JSON.parse()【从一个字符串中解析出json对象】例子://定义一个字符串vardata=‘{"name":"goatling"}‘//解析对象??JSON.parse(data)结果是:?name:"goatling"JSON.stringify()【从一个对象中解析出字符串】vardata={name:‘goatling‘}JSON.stringify(data)结果是... 查看详情
eval(data)和eval("("+data+")")的区别
如果data是字符串,使用eval("("+data+")")可以将其转换为json对象,和JSON.parse的功能一样。如果data是json对象,使用eval("("+data+")")会报错,正如你描述的错误。eval一个json对象,没有什么作用,这个时候不需要使用eval方法,直接用data... 查看详情
浅谈json.parse()json.stringify()和eval()的作用
相信大家对于JSON应该不陌生,度娘对这个名词的解释大致如下: “JSON(JavaScript ObjectNotation)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。因为采用独立于语言的文本格式,也使用了类似于C语言家族... 查看详情
json的序列化和反序列化eval()和parse()方法以及stringfy()方法
1、json解析的方法有两种:eval()和parse()方法eval()较危险,不光解析了字符串,还解析了js方法,无论何时用eval()都是非常危险的。-----不建议使用JSON.parse()较好,会解析出错误。例子[加上圆括号的目的是迫使eval函数在处理JavaScrip... 查看详情
json.parse()和jquery.parsejson()的区别
jQuery.parseJSON(jsonString):将格式完好的JSON字符串转为与之对应的JavaScript对象 (jquery方法)123var str= ‘[{"href":"baidu.com","text":"test","orgId":123,"dataType":"curry","activeClass":"haha"}]‘;&nbs 查看详情
angular.copy() 和 JSON.parse(JSON.stringify()) 之间的区别?
】angular.copy()和JSON.parse(JSON.stringify())之间的区别?【英文标题】:Differencesbetweenangular.copy()andJSON.parse(JSON.stringify())?【发布时间】:2015-06-2902:18:45【问题描述】:有人能解释一下angular.copy()和JSON.parse(JSON.stringify())之间的区别吗?... 查看详情
JSON.stringify 和 JSON.parse 之间的区别
】JSON.stringify和JSON.parse之间的区别【英文标题】:DifferencebetweenJSON.stringifyandJSON.parse【发布时间】:2013-07-2101:42:07【问题描述】:我一直对何时使用这两种解析方法感到困惑。在我回显我的json_encoded数据并通过ajax将其取回后,我... 查看详情
eval与databinder.eval的区别
DataBinder.Eval的基本格式DataBinder.Eval(Container.DataItem,"XXX","{0}")<%#DataBinder.Eval(Container.DataItem,"xxxx")%>或者<%#DataBinder.Eval(Container,"DataItem.xxxx")%> 还有一种据说微软说效率很高的方式< 查看详情
json.parse()和json.stringify()的用法区别
parse用于从一个字符串中解析出json对象,如varstr=‘{"name":"huangxiaojian","age":"23"}‘结果:JSON.parse(str)Objectage:"23"name:"huangxiaojian"__proto__:Object注意:单引号写在{}外,每个属性名都必须用双引号,否则会抛出异常。stringify()用于从一个... 查看详情