2010-03-29 25 views
20

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

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

它它序列化为:

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

反正让它只是做?

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

这在我看来,jQuery的不应该如此依赖于什么服务器端框架的少数期望的命名约定。如果我想让我的参数名为bar[],我可以很容易地将它命名为我自己,如果这是我的服务器端代码所期望的。

回答

26

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

作者讨论了为什么他们让JQuery的行为如此,并且提出了一些优秀的观点。例如,如果不使用“方括号语法”,则不能只传递一个数值的数组。

他还提供了一个解决方法:

$.ajaxSetup({ traditional: true }); 

这将告诉jQuery来使用序列的非支架方法。

+4

好吧,如果你的服务器端语言/框架不会从查询字符串,它是你的问题支持单元素数组吧:) 让我回到我原来的观点如果您的服务器端框架需要括号,那么您应该更改您的参数名称以匹配,而不是使其成为服务器不可知的前端库的默认值。 – mpeters 2010-03-31 02:28:08

+0

如果你所倡导的方法在某种程度上是“正确”的,那么我想你的论点会更引人注目。显然没有RFC或标准涵盖了应该如何处理数组语法,而且看起来像更新的技术正在选择更灵活的选项。你说JQuery不应该与“命名约定”绑定,但它明确支持这两种方法,并且你可以很容易地认为非括号语法就是绑定的语法。 – zombat 2010-03-31 03:36:47

+0

有jQuery API指出:jQuery使用相同的键序列化多个值,即{foo:[“bar1”,“bar2”]}变为'&foo = bar1&foo = bar2'。请注意,在提供的示例中,没有出现括号... – 2010-04-14 21:56:20

11

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

这种方法优于使用$.ajaxSetup()通过,指出jQuery Documentation指出:

注:此处指定的设置将影响到$阿贾克斯或 基于AJAX的衍生物,所有呼叫如$不用彷徨()。这可能会导致不需要的行为,因为其他呼叫者(例如插件)可能会将 视为正常的默认设置。为此,我们强烈建议使用 来反对使用此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(){});