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

前端之家收集整理的这篇文章主要介绍了jquery – 如何防止$.ajax将[]添加到我的密钥名称(没有processData:false)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我尝试使用$.ajax来发布数据字典,例如:
{
    list: ["fake_id_0"],mapType: "fakeToRealId"
}

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

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

如您所见,它为列表键添加括号,但不添加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我的数据.

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

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

*编辑*

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

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

解决方法

你意识到这不是一个bug.在我认为版本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相关文章