使用jQuery eval()解析JSON 时需要注意的地方

在js中将JSON字符串解析成JSON数据格式一般有两种方法:

1、使用eval()

2、使用function()对象来进行返回解析

一、使用eval函数来解析,并且使用jQuery ecah的方法进行遍历

      用jQuery解析JSON数据的方法,作为jQuery异步请求的传输对象,jquery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于JSONObject等插件封装的JSON对象,也是大同小异。

     这里用jQuery异步获取的数据类型-------json对象和字符串为例,分别介绍两种方式取到的结果和处理方式。

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

    var dataobj = eval("("+data+")");//转换为json对象

    为什么eval这里要添加("("+data+")")呢?

    原因在于eval本身。由于json是以“{}”的方式开始和结束的,在js中它会被当成一个语句块来处理,所以必须强制性的把它转换成一种表达式。

    加上圆括号的目的是迫使eval()函数在处理javascript代码时强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行. 举个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为javascript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句.所以下面两行代码执行结果是不一样的.

   alert(eval("{}"))  //return undefind

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

对于这种写法在js中可以到处看到,如:

   (function()){}(); 做闭包操作等.

<span style="font-size:18px;">alert(dataObj.root.length);//输出root的子对象数量
$each(dataObj.root.function(idx,item){
    if(idx==0){
      return true;
}
alert("name:"+item.name+",value:"+item.value);
})</span>
对于一般js生成的json对象,只需要将$each替换成for即可.

二、对于服务器返回的json字符串,如果jQuery异步请求将type设置为:json,或者利用$getJSON()方法获得服务器返回,那么就不需要eval()方法了,因为这个时候得到的结果已经是一个json对象了,只需要直接调用该对象即可.这里以$.getJSON方法为例说明数据处理方法:

$.getJSON("http://www.phpzixue.cn/",{param:"gaoyusi"},function(data){ 
//此处返回的data已经是json对象 
//以下其他操作同第一种情况 
$.each(data.root,function(idx,item){ 
if(idx==0){ 
return true;//同countinue,返回false同break 
} 
alert("name:"+item.name+",value:"+item.value); 
<p align="left" style="background:rgb(221, 237, 251);">}); 
}); </p>

这里特别需要注意的是方式1中的eval()方法是动态执行其中字符串(可能是js脚本)的,这样很容易会造成系统的安全问题。所以可以采用一些规避了eval()的第三方客户端脚本库,比如JSON in JavaScript就提供了一个不超过3k的脚本库。 

第二种解析方式就是使用Function对象来完成,它的典型应用就是在JQUERY中的AJAX方法下的success等对于返回数据data的解析 

var json='{"name":"CJ","age":18}'; 
data =(new Function("","return "+json))(); 

此时的data就是一个会解析成一个json对象了.

 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值