如何防止$ .ajax将[]添加到我的密钥名称(没有processData:false)?

时间:2013-05-31 22:17:02

标签: jquery ajax

如果我尝试使用$.ajax来发布数据字典,例如:

{
    list: ["fake_id_0"],
    mapType: "fakeToRealId"
}

jQuery做了一些奇怪的事情;它将数据转换为:

{
    list[]: ["fake_id_0"],
    mapType: "fakeToRealId"
}

如您所见,它为list键添加了括号,但没有mapType键。现在在 一般的REST意义,是的,人们通常用括号来命名带有数组值的键......但我的服务器不能正常工作,所以如果我尝试POST list[]我有问题。

我在这段代码中跟踪了这个问题,直到$.ajax处理parseData选项:

// Convert data if not already a string
if ( s.data && s.processData && typeof s.data !== "string" ) {
    s.data = jQuery.param( s.data, s.traditional );
}

如果我使用processData: false,它会跳过该块...但是它也不会为我编译URLEncode数据。

所以,我的问题是:如果没有让jQuery修改我的密钥名,make $.ajax如何调用processData: true?或者如果失败了,我如何使用processData: false,但仍然可以从括号添加之外的所有效果获得效果?

P.S。或者,如果这是所有非标准的jQuery行为,由我所拥有的一些插件引起,请告诉我相反: - )

*编辑*

我回答了自己的问题,然后删除了答案,因为我意识到它有缺陷。我回答说设置选项traditional:true(在$.ajax调用中)修复括号,它确实...但它也有副作用,即它不会序列化嵌套对象。 / p>

所以我修改过的问题是:如果没有jQuery修改我的密钥名称而不禁用其嵌套属性的序列化,如何使$.ajax调用processData: true?换句话说,我如何让jQuery做与目前相同的一切...除了不在我的键上添加括号?

2 个答案:

答案 0 :(得分:3)

你意识到这不是一个错误。在我认为版本1.4之后,括号被专门用于解决多级对象的问题。您可以查看.param()本身以了解原因。 http://api.jquery.com/jQuery.param/

我相信你想要的是不可能的,验证的好方法是尝试手动编码一个字符串。我相信如果没有括号,你将无法以唯一可解码的方式对其进行编码。

修改我的答案,引用上述链接

  

注意:由于某些框架解析序列化数组的能力有限,开发人员在传递包含嵌套在另一个数组中的对象或数组的obj参数时应谨慎。

     

注意:由于param字符串没有普遍认可的规范,因此无法使用此方法对所有支持此类输入的语言进行理想的编码来编码复杂数据结构。使用JSON格式代替编码复杂数据。

因此,如果您的服务器已准备好解析json,那么您可以像这样发送您的请求。

$.ajax({
    url: 'something',
    type: 'GET',
    data: JSON.stringify(data),
    contentType: 'application/json; charset=utf-8',
});

答案 1 :(得分:1)

我知道问题机构已经暗示了这一点,但是在这里你是如何避免jQuery的这个奇妙功能的。如果你有:

$.get(api_url, {my_param: my_arguments})

将其更改为:

$.get(api_url, $.param({my_param: my_arguments}, true))