jQuery通过ajax传值序列化问题

今天使用ajax传值的是时候,spring后台始终收不到数组参数的值,检查了可能出现错误的地方都没发现问题的根本。
大致代码如下:

1
2
3
4
5
6
var goodsIDs = [];
goodsIDs.push("0001");
goodsIDs.push("0002");
goodsIDs.push("0003");
$.post('goodsController/getGoodsInfo.do',goodsIDs:goodsIDs,function(result){});

在用chrom的开发工具查看请求头的时候发现参数信息变成了goodsIDs[]=0001&goodsIDs[]=0002&goodsIDs[]=0003。多了一对方括号,所以后台spring才没有解析出参数来。于是我在后台方法上参数里面加上了这个方括号,问题成功解决了。

但是越想越觉得不对劲,为什么要这么做呢。于是google了半天才发现,原来是jquery1.4以后嵌套参数的序列化方法有说差别,才导致这个问题的发生。

jQuery 1.4在jQuery.param方法里加入了嵌入参数序列化的支持,借用了PHP编程里兴起的,而后又被Ruby on Rails推广开来的方式。

举例来说,{foo: [“bar”, “baz”]} 会被序列化为 “foo[]=bar&foo[]=baz”.

在jQuery 1.3版里, {foo: [“bar”, “baz”]} 曾被序列化为 “foo=bar&foo=baz”. 但是,这样做没用办法将只含有一个元素的阵列编码。如果你需要旧的序列化方式,你可以设置传统Ajax设置来进行切换。

总共有3种方式可以切换到旧的序列化方式:

1
2
3
4
5
6
7
8
// 全局改变序列化方式 (使用旧的序列化方式)
jQuery.ajaxSettings.traditional = true;
// 指定情况使用旧的序列化方式
jQuery.param( getGoodsInfo, true );
// 针对一个单独的Ajax请求使用旧的序列化方式
$.ajax({ data: getGoodsInfo, traditional: true });

想了解更多细节,参考jQuery 官方API