为什么jQuery ajax不会序列化我的对象?

时间:2012-02-07 15:58:33

标签: jquery serialization

我正在使用jQuery 1.7.1。我有以下问题/问题:

代码如下:

var accountObject = new Object();
accountObject.account = new Object();
accountObject.account.sas = [];

$.ajax({
    type: "PUT",
    url: "/a/2",
    data: accountObject,
    dataType: "html",
    success: function(msg) {
        alert_user("Successfully saved the selected session attributes as defaults");
    },
    error: function(msg) {
        alert_user(msg);            
    }
});

问题是,由于我将accountObject.account.sas设置为空数组,data在服务器上完全为空,如下所示:

{}

应该是:

{ "account": { "sas": [] } }

当我在sas的{​​{1}}属性中添加一些条目时,一切正常。例如,如果我将字符串“1”,“2”和“3”作为数组account,那么我就进入服务器:

["1", "2", "3"]

有人知道为什么会这样吗?

提前致谢 Panayotis

2 个答案:

答案 0 :(得分:2)

问题是无法在查询字符串中正确表示空数组。当您将对象层次结构传递给data时,jQuery将尝试将其转换为查询字符串,但无法弄清楚如何处理空数组。

1.4.4似乎在传递相同层次结构时返回空字符串的原因是它试图将键传递给没有值的查询字符串,其结果如下:{{1} }。默认情况下,这在大多数服务器环境中被解释为空字符串。

我个人认为1.7.1的行为是正确的,因为它迫使开发人员检查参数是否存在而不是破坏参数的类型。


关于此处提及的各种事项的一些注意事项

  • ...&property=&完全错误,因为它永远无法处理对象层次结构。您获得的是:traditional: true,这是所有对象的javascript ...&key=[object Object]默认结果。

  • 分配给toString()
  • JSON.stringify将导致整个事件作为JSON传递给查询字符串,除非您将其与data结合使用,在这种情况下您需要反序列化在服务器端“手动”进入有意义的对象。它通常是一个有用的选项,但在这种情况下过度杀戮,在这种情况下,简单的检查可能会让事情变得简单。

答案 1 :(得分:0)

你的问题是空数组。您可以发送空字符串,也可以根据this尝试设置traditional: true

还有this个答案,来自traditional的apaart也建议使用JSON.stringify。在评论中他们还提到了aps.net mvc模型绑定器的问题。

我不知道ruby是如何实现相当于asp.net mvc的模型绑定的,但我认为这是你应该看的地方。