前一段时间碰到一个问题,server端返回了json字符串,在ajax请求的success回调函数中不进行类型转换就能直接遍历返回的字符串数组?server端代码如下:
response.getWriter().write(cardservice.sgetCompanyInfo(comname,comarea,comtype).toString());很明显,java web返回的是jsonArray转化成string 。然后ajax的处理逻辑代码如下:
$.ajax({
url:"card/queryCompany.html",
type:"post",
dataType:"json",
async: false,
data:{comName:$("#comName").val(),comArea:$("#comArea").val(),comType:$("#comType").val()},
success:function(data){
$(data).each(function(index){
var val = data[index];
});
Cookies.set("cmpSearchResult",data);可以看到ajax的success对应的代码直接把从服务器返回的data用jquery的each方法进行遍历处理。这是为什么呢?js虽然是弱类型语言,但也不能这么将就吧。我认为是ajax请求内部对string类型进行了转化,后来验证是对的。
请注意:
dataType:"json"如果我把这一句删除了,就会出现解析出错的问题。
进一步验证如下:
$.ajax({
url:"card/queryCompany.html",
type:"post",
async: false,
data:{comName:$("#comName").val(),comArea:$("#comArea").val(),comType:$("#comType").val()},
success:function(data){<span style="white-space:pre"> </span>var data1 = eval("("+data+")");
$(data1).each(function(index){
var val = data1[index];
});
Cookies.set("cmpSearchResult",data);
},这个问题是搞清楚了,但是我把data数据写入cookie之后,再从cookie之中读取出来同样出现了不能直接遍历的问题:
<span style="white-space:pre"> </span>Cookies.set("cmpSearchResult",data);<span style="white-space:pre"> </span>var data = Cookies.get("cmpSearchResult");
//eval方法加()的目的是将方法中的参数转化为表达式,因为json是以{}开头结尾的,这样容易让eval误会。不过jsonArray的话就不用
var dataJSON = eval("("+data+")");
$.each(dataJSON, function (index, val)
{
});那么为什么呢?个人理解是data写入cookie之中时候,是把jsonArray对象转化成字符串的形式写入的。然后你再从中入去的话就需要把string eval成jsonArray对象,这样才能获取相关属性。
总结:弱类型语言并不意味着类型不用转换。

本文深入探讨了Ajax请求如何处理服务器返回的JSON数据,解释了为什么在某些情况下可以不进行类型转换直接遍历数组,并详细说明了将JSON数据写入Cookie后无法直接遍历的原因。同时,提供了将JSON数据从Cookie中正确解析并访问的方法。
361

被折叠的 条评论
为什么被折叠?



