在以json发送数据时,jQuery Form Data中的括号问题

我有这个对象

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是一个数组,jQuery会根据传统设置的值使用相同的键序列化多个值

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

这个带有键中括号的符号在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 

分别。

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

传统类型:布尔值

如果您希望使用传统的param序列化样式,请将此属性设置为true。

例如:

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

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

执行此操作的函数是jQuery.param 。 作为一个如何工作的例子:

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

data是一个数组。 当它被序列化时,它被呈现为data%5B%5D=value3&data%5B%5D=value4 。 serverside脚本将其转换为数组。

这主要是一个命名约定 – 我认为从PHP – 表明密钥( key3 )是多值的。 由服务器来解决这些有意义的问题。

更多细节: http : //api.jquery.com/jQuery.param/