没有括号乱七八糟的JQuery参数序列化

时间:2010-03-29 19:56:31

标签: javascript jquery

我正在使用JQuery向服务器发出JSON请求,并且它的参数序列化似乎是硬编码到PHP期望的,而不是通用的。基本上我有一个看起来像这样的对象:

{
    foo: 1,
    bar : [1, 3, 5]
}

并将其序列化为:

foo=1&bar[]=1&bar[]=3&bar[]=5

无论如何要做到这一点吗?

foo=1&bar=1&bar=3&bar=5

在我看来,jQuery不应该与少数服务器端框架所期望的命名约定相关联。如果我希望我的param被称为bar[],我可以很容易地将它命名为我自己的服务器端代码所期望的。

2 个答案:

答案 0 :(得分:27)

我假设你正在使用JQuery 1.4。你应该看看这个:http://benalman.com/news/2009/12/jquery-14-param-demystified/

作者讨论了为什么他们让JQuery以这种方式表现,并提出了一些优点。例如,如果不使用“方括号语法”,则不能仅使用单个值传入数组。

他还提供了解决方法:

$.ajaxSetup({ traditional: true });

这将告诉JQuery使用非括号的序列化方法。

答案 1 :(得分:15)

可以使用$.param(obj,true)将对象转换为参数化字符串。第二个布尔参数表示应该使用传统的序列化对象的方法。传统方法遇到相同的参数名称时不使用方括号。从$.param返回的序列化字符串可以通过任何ajax方法传递。

此方法优于使用jQuery Documentation所指出的$.ajaxSetup()

  

注意:此处指定的设置将影响对$ .ajax的所有调用或   基于AJAX的衍生产品,例如$ .get()。这可能导致不良后果   因为其他调用者(例如插件)可能会期待这种行为   正常的默认设置。出于这个原因,我们强烈建议   反对使用此API。相反,在。中明确设置选项   调用或定义一个简单的插件来执行此操作。

示例:

var obj = {myProp: "test", arr: [1,2,3,4]};
var serializedObj = $.param(obj, true); //myprop=test&arr=1&arr=2&arr=3&arr=4

$.post(url,serializedObj,function(){});