代码之家  ›  专栏  ›  技术社区  ›  mpeters

不带括号的jquery参数序列化

  •  21
  • mpeters  · 技术社区  · 15 年前

    我正在使用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不应该如此依赖于少数服务器端框架所期望的命名约定。如果我想叫我的爱人 bar[] 如果这是我的服务器端代码所期望的,我可以很容易地自己命名它。

    2 回复  |  直到 10 年前
        1
  •  27
  •   zombat    15 年前

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

    作者讨论了他们为什么让jquery这样做,并提出了一些优点。例如,如果不使用“方括号语法”,则不能传入只有一个值的数组。

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

    $.ajaxSetup({ traditional: true });
    

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

        2
  •  14
  •   Kevin Bowersox    12 年前

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

    这种方法比使用 $.ajaxSetup() 正如 jQuery Documentation 该州:

    注意:此处指定的设置将影响对$.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(){});