这里根据jquery异步获取的数据类型——json对象和字符串,分别介绍两种方法得到的结果处理方法。
1、对于服务器返回的JSON字符串,如果jquery异步请求没有指定类型,或者以字符串的形式接受jquery解析json字符串,那么就需要将其对象化。 方法也不算太麻烦jquery解析json字符串,只需要把字符串在 eval() 中执行一次即可。 这些方法也适合用常见的javascipt方法获取json对象。 下面的例子说明:
vardataObj=eval("("+data+")");//转换为json对象
alert(dataObj.root.length);//输出root的子对象数量
$.each(dataObj.root,fucntion(idx,item){
如果(idx==0){
返回真;
//输出每个根子对象的名称和值
Alert("名称:"+item.name+",值:"+item.value);
})
2、对于服务器返回的JSON字符串,如果jQuery异步请求将type(通常是这个配置属性)设置为“json”,或者使用$.getJSON()方法获取服务器的返回,则eval() method 不是必须的,由于此时获取的结果已经是一个json对象,所以只需要直接调用该对象即可。 这里以$.getJSON方法为例来说明数据处理方法:
$.getJSON("http://www.111com.net/",{param:"gaoyusi"}, function(data){
//这里返回的数据已经是一个json对象
//以下其他操作与第一种情况相同
$.each(data.root,函数(idx,item){
如果(idx==0){
returntrue;//与countinue相同,返回false与break相同
eval解析JSON的注意点
在JS上将JSON字符串解析为JSON数据格式,通常有两种形式:
1.一种是使用eval()函数。
2.使用Function对象进行返回分析。
使用eval函数来解析,但是使用jquery的each方法来遍历
使用jquery解析JSON数据,作为jquery异步请求的传输对象,jquery请求后返回的结果是一个json对象,这里是服务器以JSON方式返回字符串的方式,对于插件封装的JSON对象如JSONObject ,这也是金城的一个小区别,这里就不解释了。
这里先给出JSON字符串集,字符串集如下:
代码如下所示:
变量数据=“
根:
{名称:'1',值:'0'},
{name:'6101',value:'深圳'},
{name:'6102',value:'上海'},
{name:'6103',value:'深圳'},
{name:'6104',value:'上海'},
{name:'6105',value:'新乡市'},
{name:'6106',value:'汉中市'},
{name:'6107',value:'西安'},
{name:'6108',value:'大同市'},
{name:'6109',value:'商洛市'},
{name:'6110',value:'西安市'}
}";
根据jquery异步获取的数据类型——json对象和字符串,这里给出两种形式获取的结果处理方法。
1、对于服务器返回的JSON字符串,如果jquery异步请求没有指定类型,或者以字符串的形式接受,那么就需要将其对象化。 方法也不算太麻烦,只需要把字符串在 eval() 中执行一次即可。 这些方法也适合用常见的javascipt方法获取json对象。 下面的例子说明:
vardataObj=eval("("+data+")");//转换为json对象
为什么这里要加“(”(“+data+”)”);//”呢?
原因是:eval本身的问题。 因为json以“{}”的形式开始和结束,在JS中,会被当成一个句子块,所以必须强制转换为表达式。
添加括号的目的是强制eval函数在处理JavaScript代码时将括号中的表达式(表达式)转换为对象,而不是作为句子(语句)执行。 举个反例,比如对象字面量 {},如果不加内括号,那么 eval 就会把大括号识别为 JavaScript 代码块的开始和结束标签,所以 {} 会被认为执行了一个空句子。 所以下面两个执行结果是不同的:
复制代码代码如下:
Alert(eval("{}");//返回未定义
alert(eval("({})");//返回object[Object]
对于这些写法,在JS中,随处可见。
如:(function()){}(); 进行闭包操作等时
-------------------------------------------------- ------------------------------------------
alert(dataObj.root.length);//输出root的子对象数量
$.each(dataObj.root,fucntion(idx,item){
如果(idx==0){
返回真;
//输出每个根子对象的名称和值
Alert("名称:"+item.name+",值:"+item.value);
})
注意:普通js生成json对象只需要把$.each()方法换成for语句即可,其他不变。
2、对于服务器返回的JSON字符串,如果jQuery异步请求将type(通常是这个配置属性)设置为“json”,或者使用$.getJSON()方法获取服务器的返回,则eval() method 不是必须的,由于此时获取的结果已经是一个json对象,所以只需要直接调用该对象即可。 这里以$.getJSON方法为例来说明数据处理方法:
$.getJSON("http://www.111com.net/",{param:"gaoyusi"}, function(data){
//这里返回的数据已经是一个json对象
//以下其他操作与第一种情况相同
$.each(data.root,函数(idx,item){
如果(idx==0){
returntrue;//与countinue相同,返回false与break相同
Alert("名称:"+item.name+",值:"+item.value);
});
});
这里非常需要注意的是,表格1中的eval()方法动态执行字符串(可能是js脚本),很容易导致系统安全问题。 因此,可以使用一些避免使用 eval() 的第三方客户端脚本库。 例如JSONinJavaScript提供了不超过3k的脚本库。
第二种分析方法是使用Function对象来完成,其典型应用是JQUERY中AJAX模式下成功等返回数据的分析
varjson='{"姓名":"CJ","年龄":18}';
数据=(newFunction("","return"+json))();
此时的数据是一个将要解析的json对象。