前一段时间碰到一个问题,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对象,这样才能获取相关属性。
总结:弱类型语言并不意味着类型不用转换。