jquery - Rails 无法正确解码来自 jQuery 的 JSON(数组变成带有整数键的散列

每次我想用 jQuery 将一组 JSON 对象发布到 Rails 时,我都会遇到这个问题。 如果我对数组进行字符串化,我可以看到 jQuery 正在正常工作:

"shared_items"=>"[{\"entity_id\":\"253\",\"position\":1},{\"entity_id\":\"823\",\"position\":2}]"

但如果我只是将数组作为 AJAX 调用的数据发送,我会得到:

"shared_items"=>{"0"=>{"entity_id"=>"253", "position"=>"1"}, "1"=>{"entity_id"=>"823", "position"=>"2"}}

而如果我只是发送一个普通数组,它就可以工作:

"shared_items"=>["entity_253"]

为什么 Rails 将数组更改为那个奇怪的哈希?想到的唯一原因是 Rails 无法正确理解内容,因为这里没有类型(有没有办法在 jQuery 调用中设置它?):

Processing by SharedListsController#create as 

谢谢!

更新: 我将数据作为数组而不是字符串发送,并且该数组是使用 .push() 函数动态创建的。尝试使用 $.post$.ajax,结果相同。

最佳答案

如果有人偶然发现并想要更好的解决方案,您可以在 .ajax 调用中指定“contentType: 'application/json'”选项,并让 Rails 正确解析 JSON 对象,而不会将其乱码为整数键散列具有全字符串值。

所以,总而言之,我的问题是:

$.ajax({
  type : "POST",
  url :  'http://localhost:3001/plugin/bulk_import/',
  dataType: 'json',
  data : {"shared_items": [{"entity_id":"253","position":1}, {"entity_id":"823","position":2}]}
});

导致 Rails 将事物解析为:

Parameters: {"shared_items"=>{"0"=>{"entity_id"=>"253", "position"=>"1"}, "1"=>{"entity_id"=>"823", "position"=>"2"}}}

而这(注意:我们现在正在对 javascript 对象进行字符串化并指定内容类型,因此 rails 将知道如何解析我们的字符串):

$.ajax({
  type : "POST",
  url :  'http://localhost:3001/plugin/bulk_import/',
  dataType: 'json',
  contentType: 'application/json',
  data : JSON.stringify({"shared_items": [{"entity_id":"253","position":1}, {"entity_id":"823","position":2}]})
});

在 Rails 中生成一个不错的对象:

Parameters: {"shared_items"=>[{"entity_id"=>"253", "position"=>1}, {"entity_id"=>"823", "position"=>2}]}

这适用于我在 Rails 3 中的 Ruby 1.9.3 上。

关于jquery - Rails 无法正确解码来自 jQuery 的 JSON(数组变成带有整数键的散列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6410810/

相关文章:

python - python中的json.dump()和json.dumps()有什么区别?

javascript - JSON 是否应该包含空值

arrays - 数组可以是顶级 JSON 文本吗?

python - 如何使用 python 请求和处理 JSON?

python - Google App Engine 模型的 JSON 序列化

javascript - 请求的资源错误中不存在 'Access-Control-Allow-Ori

c# - 将 POST 中的 json 发送到 Web API 服务时出错

javascript - JSON Stringify 因 UTC 而更改日期时间

javascript - 在 promise 链上使用 setTimeout

javascript - 如果名称包含点,如何获取对象值?