JSON.parse与eval的区别

JSON.parse与eval和能将一个字符串解析成一个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~指向一个恶意的连接~那完了。同时eval在解析字符串时,会执行该字符串中的代码,比如一些值运算它会直接计算出结果。
从这个层面讲~还是推荐使用JSON.parse来实现json格式字符串的解析
JSON.parse
这方法只能解析属性名是双引号包裹的字符串对象,并会忽略换行和空格(值外面)。但是,从MDN对JSON的描述,能解析的JSON字符串的条件完整如下
JavaScript类型  JSON与之区别
对象和数组
属性名称必须用双引号包裹;
最后一个属性后面不能有逗号。
数值
前导0不能使用(在 JSON.stringify 中将会被忽略,在 JSON.parse 会抛出错误);
小数点后面至少有一个数字。
字符串
只有有限的字符能够被转义;
不允许某些控制字符;但允许使用Unicode 行分隔符 (U+2028) 和段落分隔符 (U+2029) ;
字符串必须用双引号括起来。
这方法还可以捕捉JSON中的语法错误,并允许你传入一个函数,用来过滤或转换解析结果!

eval

eval函数可将一个JavaScript代码字符串求值成特定的对象,所以解析成JSON对象只不过是作用之一。
为什么eval()解析JSON字符串要加上括号?
原因是两点:
1. json对象是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理。
2. 加上圆括号为了处理字符串为表达式,而不是语句(statement)来执行。




猜你喜欢

转载自blog.csdn.net/qq_34571519/article/details/79321516