我正在使用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[]
,我可以很容易地将它命名为我自己的服务器端代码所期望的。
答案 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(){});