JavaScript对JSON的解析

来源:互联网 发布:小语网络加速器注册 编辑:程序博客网 时间:2024/06/05 22:44

JSON.parse()

JSON 通常用于与服务端交换数据。 在接收服务器数据时一般是字符串。 我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。
语法

JSON.parse(text, reviver)

参数说明:
text:必需, 一个有效的 JSON 字符串。
reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。

如果我们从服务器通过AJAX等获得了JSON数据,通过JSON.parse(data);
即将data数据装配为JavaScript对象,当然解析前要确保你的数据是标准的 JSON 格式,否则会解析出错。

异常
JSON 不能存储 Date 对象。
如果你需要存储 Date 对象,需要将其转换为字符串。
之后再将字符串转换为 Date 对象。

我们可以利用parse的第二个参数reviver,一个转换结果的函数,对象的每个成员调用此函数。

var text = '{ "name":"wither", "initDate":"2015-10-14", "site":"www.wither3.com"}';var obj = JSON.parse(text, function (key, value) {    if (key == "initDate") {        return new Date(value);    } else {        return value;}});document.getElementById("demo").innerHTML = obj.name + "创建日期:" + obj.initDate;

eval(text)

对于服务器返回的JSON字符串,如果 jQuery 异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将该字符串放于 eval()中执行一次。
这种方式也适合以普通 javascipt 方式获取 json 对象,以下举例说明:

var u = eval('('+user+')');

为什么要 eval 这里要添加 (‘(‘+user+’)’) 呢?
原因在于:eval 本身的问题。 由于 json 是以 {} 的方式来开始以及结束的,在 js 中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
加上圆括号的目的是迫使 eval 函数在处理 JavaScript 代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量 {},如若不加外层的括号,那么 eval 会将大括号识别为j avascript 代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:

alert(eval("{}"); // return undefinedalert(eval("({})");// return object[Object]

测试实例

var user = '{name:"张小妞",age:21,'+       'address:{city:"武汉",zip:"430000"},'+    'email:"zhangxiaoniu@163.com",'+      'showInfo:function(){'+      'document.write("姓名:"+this.name+"<br/>");'+      'document.write("年龄:"+this.age+"<br/>");'+      'document.write("地址:"+this.address.city+"<br/>");'+      'document.write("邮编:"+this.address.zip+"<br/>");'+      'document.write("E-mail:"+this.email+"<br/>");} }';   var u = eval('('+user+')');  u.showInfo();

如上所示,使用eval函数解析JSON是一种很不安全的方式,原因是eval不但可以解析JSON字符串,还会执行其中的代码块(如果有的话)

两者区别

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

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

此时执行eval方法后会先弹出一个wtf的提示框~

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

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

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

Give me Your galaxy

原创粉丝点击