【问题标题】:Automatically convert hash keys to camelCase in JBuilder在 JBuilder 中自动将哈希键转换为 camelCase
【发布时间】:2016-09-30 20:49:07
【问题描述】:

我正在使用 JBuilder 版本 2.4.1 和 Rails 4.2.6。我正在尝试将复杂对象序列化为 JSON。代码如下:

json.key_format! camelize: :lower

json.data_object @foo

@foo 看起来像这样:

{
  key: 'value',
  long_key: 'value'
}

我希望它被呈现为

{
  "dataObject": {
    "key": "value",
    "longKey": "value"
  }
}

但它保留了原始的哈希键,只将 data_object 转换为 camelCase

{
  "dataObject": {
    "key": "value",
    "long_key": "value"
  }
}

所以问题是:使用 JBuilder 骆驼化哈希键的正确方法是什么?

【问题讨论】:

  • 只是提到jbuilder现在有Jbuilder.deep_format_keys true,这正是你想要的。我知道这是一篇旧帖子,但我能找到它,而且我可能不是唯一一个 :)

标签: ruby-on-rails ruby jbuilder


【解决方案1】:

正如 Bryce 所提到的,Jbuilder 使用 to_json 而不是处理哈希。

一个简单的解决方案是使用json.set! 手动序列化哈希。

json.key_format! camelize: :lower

json.data_object do
  @foo.each do |key, value|
    json.set! key, value
  end
end

虽然有一个问题:如果@foo 为空,它根本不会创建对象。这些是我找到的解决方案:

  1. 在序列化之前定义一个空哈希

    json.key_format! camelize: :lower
    
    json.data_object({}) # don't forget parentheses or Ruby will handle {} as a block 
    
    json.data_object do
      @foo.each do |key, value|
        json.set! key, value
      end
    end
    
  2. 如果源变量为空,则序列化一个空哈希

    json.key_format! camelize: :lower
    
    if (@foo.empty?) do 
      json.data_object({})
    else 
      json.data_object do
        @foo.each do |key, value|
          json.set! key, value
        end
      end
    end
    

    或者,如果您更喜欢扁平化代码

    json.key_format! camelize: :lower
    
    json.data_object({}) if @foo.empty?
    
    json.data_object do
      @foo.each do |key, value|
        json.set! key, value
      end
    end unless @foo.empty?
    

但是,如果您必须序列化嵌套对象,这些解决方案将不起作用。您可以通过在 Jbuilder 中猴子修补 json 对象来实现深度序列化

def json.hash!(name, hash)
  if hash.empty?
    set! name, {}
  else
    set! name do
      hash.each do |key, value|
        if value.is_a?(Hash)
          hash! key, value
        else
          set! key, value
        end
      end
    end
  end
end

然后您可以简单地使用json.hash! :data_object, @foo 并获得所需的结果。

【讨论】:

    【解决方案2】:

    尝试在您的应用程序中全局设置此项(例如 config/environment.rb)

    Jbuilder.key_format camelize: :lower
    

    【讨论】:

    • 我得到了同样的结果。它不会骆驼化哈希键
    • 嗯,我确定你做到了,但是你在添加之后重启了你的 Rails 服务器,对吗?您还确定 jbuilder 正在呈现 JSON 模板,并且 rails 不只是回退到 to_json 吗?您可能需要考虑构建加载到 json.array rubydoc.info/github/rails/jbuilder/Jbuilder:array! 中的哈希数组
    • 是的,我确实重新启动了它。甚至做了几次,只是为了确定。我不完全确定 to_json。如果你能解释这一点,我会很高兴。目前我有一个使用循环的解决方法,如果没有人找到更好的解决方案,我会发布。
    • 在我看来,它仍然默认使用 to_json 渲染并绕过 Jbuilder,因此没有应用骆驼化转换。 github.com/rails/jbuilder/issues/236
    【解决方案3】:

    我不确定这是否仍然相关。但是对于那些仍在寻找优雅解决方案的人,我建议看看:

    https://github.com/vigetlabs/olive_branch

    此 gem 可让您的 API 用户传入并接收 camelCased 或 dash-cased 密钥,而您的 Rails 应用程序接收并生成 snake_cased 密钥。

    这是一篇文章,作者解释了这颗宝石背后的想法。 https://www.viget.com/articles/introducing-olivebranch/

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多