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

标签 jquery ajax

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

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

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

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

如您所见,它向list添加了括号。键,但不是 mapType key 。现在在一个 一般的 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它确实跳过了该 block ...但它也不会为我对我的数据进行 URLEncode。

所以,我的问题是:如何制作 $.ajax调用 processData: true没有让 jQuery 修改我的键名?或者如果失败了,我该如何使用 processData: false ,但仍能获得该选项的所有效果除了添加括号?

附注或者,如果这都是非标准 jQuery 行为,是由我拥有的某些插件引起的,请让我知道:-)

* 编辑*

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

所以我修改后的问题是:如何制作 $.ajax调用 processData: true不让 jQuery 修改我的键名并且不禁用其嵌套属性的序列化?换句话说,我如何让 jQuery 执行与当前相同的所有操作...除了不在我的键中添加括号之外?

最佳答案

正如您所意识到的,这不是一个错误。我相信在 1.4 版本之后,括号是专门为了解决多级对象的问题而放在那里的。您可以查看 .param() 本身以了解原因。 http://api.jquery.com/jQuery.param/

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

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

Note: Because some frameworks have limited ability to parse serialized arrays, developers should exercise caution when passing an obj argument that contains objects or arrays nested within another array.

Note: Because there is no universally agreed-upon specification for param strings, it is not possible to encode complex data structures using this method in a manner that works ideally across all languages supporting such input. Use JSON format as an alternative for encoding complex data instead.

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

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

关于jquery - 如何防止 $.ajax 将 [] 添加到我的键名称中(没有 processData : false)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16866829/

相关文章:

javascript - Http 发布 URL 安全

ajax - ie9中跨域发布数据从http服务器到https服务器

c# - 在 ASP.NET 中使用 JQuery UI 自动完成的有效方法

javascript - 在 jQuery 中使用数组作为选择器

javascript - 如何将逗号分隔的多选值传递到表单提交上的 url

php - 如何通过ajax-POST使用jquery将多个字符串发送到数据库到php文件?

javascript - 重构许多 jQuery Ajax 调用 - 最佳实践?

javascript - 从 iframe 打开 JQuery UI 对话框,以便当 iframe 来自不同域时它位于顶部窗口

javascript - 我已经在滚动上制作了动画,但是我想要应用的样式阻止了它的工作

javascript - 我无法使用 ajax 在 wordpress 中将 $_POST 从 js 获取到 php