【问题标题】:issue with brackets in jQuery Form Data when sending data as json将数据作为 json 发送时,jQuery 表单数据中的括号问题
【发布时间】:2011-08-26 01:25:56
【问题描述】:

我有对象

    var dataformdata={"key1":"value1","key2":"value2"};

然后我使用相同的键(key3)添加更多值

    dataformdata.key3 = [];
    dataformdata.key3.push("value3");
    dataformdata.key3.push("value4");

我在每个斜坡上执行上述操作。除了通过浏览器控制台中的 jQuery ajax 函数发送 dataformdata 对象之外,这一切都有效,我看到键中有括号...

$.ajax({ type: "POST", url: "/", data: dataformdata,...

这是我在浏览器控制台中看到的:

key1:value1
key2:value2
key3%5B%5D:value3
key3%5B%5D:value4

它应该可以工作,因为在 jQuery.ajax() 文档中它说

对象必须是键/值对。如果 value 是一个 Array,jQuery 会根据传统设置的 value 序列化多个具有相同 key 的值

但是为什么键中的括号(%5B%5D)?

【问题讨论】:

标签: jquery ajax json object brackets


【解决方案1】:

您还可以在 ajax 调用中使用 traditional 设置 http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings

传统类型:布尔型

如果您希望使用 传统的参数序列化风格。

例如:

$.ajax({
 /*usual stuff */
 traditional: true
})

【讨论】:

  • 可能不完全是这个问题的答案,但根据上面的答案,这对我来说是发送具有相同键的多个值的混合,以及唯一的键和值。 $.ajax(url, { data: { id: [value1,value2], whatever: true }, traditional: true, dataType: "json" });
【解决方案2】:

在 jQuery 1.4 中引入了键中的括号符号来处理多维数组,或包含对象(或其他数组)本身的数组。这有助于反序列化器区分数组和原始值。例如,如果键中没有括号,这两个变量将以相同的方式序列化:

var v1 = { "k1":"v1", "k2":"v2", "k3":["v3"] };

var v1 = { "k1":"v1", "k2":"v2", "k3":"v3" };

使用括号符号,它们被编码为

k1=v2&k2=v2&k3[]=v3

k1=v2&k2=v2&k3=v3

分别。

【讨论】:

  • 感谢您的解释。我发现我可以使用 jQuery.param(dataformdata, true) 删除括号,执行传统的“浅”序列化。
【解决方案3】:

可以将具有相同键名的多条数据发送到脚本。您可以通过在键名末尾添加方括号 [] 来指定数据应被解释为数组。

执行此操作的函数是jQuery.param。作为其工作原理的示例:

$.param({
    data: ['value3', 'value4']
});

data 是一个数组。当它被序列化时,它被渲染为data%5B%5D=value3&data%5B%5D=value4。服务器端脚本会将其转换为数组。

【讨论】:

    【解决方案4】:

    这主要是一种命名约定——我认为来自 PHP——表明键 (key3) 是多值的。由服务器对这些进行有意义的解码。

    更多详情:http://api.jquery.com/jQuery.param/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2017-03-12
      • 2013-03-06
      相关资源
      最近更新 更多