ruby-on-rails - Rails 在请求的参数中将空数组转换为 nil

我的应用中有一个 Backbone 模型,它不是典型的平面对象,它是一个大型嵌套对象,我们将嵌套部分存储在 MySQL 数据库的 TEXT 列中。

我想在 Rails API 中处理 JSON 编码/解码,以便从外部看起来您可以 POST/GET 这个大型嵌套 JSON 对象,即使它的一部分存储为字符串化 JSON 文本。

但是,我遇到了 Rails 神奇地将空数组转换为 nil 值的问题。例如,如果我发布这个:

{
  name: "foo",
  surname: "bar",
  nested_json: {
    complicated: []
  }
}

我的 Rails Controller 看到了这个:

{
  :name => "foo",
  :surname => "bar",
  :nested_json => {
    :complicated => nil
  }
}

所以我的 JSON 数据已被更改..

以前有人遇到过这个问题吗?为什么 Rails 会修改我的 POST 数据?

更新

这是他们做的地方:

https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/request.rb#L288

这就是~为什么他们这样做:

https://github.com/rails/rails/pull/8862

所以现在的问题是,在我的嵌套 JSON API 情况下如何最好地处理这个问题?

最佳答案

经过大量搜索,我发现您从 Rails 4.1 开始可以完全跳过 deep_munge “功能”

config.action_dispatch.perform_deep_munge = false

我找不到任何文档,但您可以在此处查看此选项的介绍: https://github.com/rails/rails/commit/e8572cf2f94872d81e7145da31d55c6e1b074247

这样做可能存在安全风险,此处记录:https://groups.google.com/forum/#!topic/rubyonrails-security/t1WFuuQyavI

https://stackoverflow.com/questions/14647731/

相关文章:

javascript - 在 JavaScript 中查找 JSON

jquery - 如何在 jQuery 中将项目添加到数组中?

json - 下载 jackson.codehaus.org jar

.net - 从 JSON Schema 生成 C# 类

javascript - 使用 jQuery 循环并获取 JSON 数组的键/值对

json - 如何将 Swift 对象序列化或转换为 JSON?

java - jackson 通过删除 'is' 重命名原始 boolean 字段

javascript - 为什么 JSON.parse 会因空字符串而失败?

java - 使用 Jackson 将 JSON 反序列化为多态类型 - 一个完整的示例给了我一个编

java - 从发布请求中读取 JAX-RS 客户端中的响应正文