Rails - 使用camelize将模型序列化为JSON

时间:2011-06-02 00:00:45

标签: ruby-on-rails json serialization activerecord

我需要将模型序列化为json并使所有键都被骆驼化。我看到to_xml中有一个选项允许使用驼峰。我似乎无法强迫json序列化给我一个camelized哈希。这是铁路可能的事吗?

5 个答案:

答案 0 :(得分:10)

我有类似的问题。经过一些研究后,我将as_json ActiveModel方法与一个可以使用Hash密钥的帮助程序包装起来。然后我将模块包含在相关模型中:

# lib/camel_json.rb
module CamelJson
  def as_json(options)
    camelize_keys(super(options))
  end

  private
  def camelize_keys(hash)
    values = hash.map do |key, value|
      [key.camelize(:lower), value]
    end
    Hash[values]
  end
end



# app/models/post.rb
require 'camel_json'
class Post < ActiveRecord::Base
    include CamelJson
end

这对我们的情况非常有效,这种情况相对简单。但是,如果你正在使用JBuilder,显然有一个配置将camel case设置为默认值:https://stackoverflow.com/a/23803997/251500

答案 1 :(得分:5)

如果您使用的是rails,请跳过添加的依赖项并使用Hash#deep_transform_keys。它还有一个额外的好处,就是使用嵌套的 (如果你正在做user.as_json(includes: :my_associated_model)这样的事情,那就很方便了):

h = {"first_name" => "Rob", "mailing_address" => {"zip_code" => "10004"}}
h.deep_transform_keys { |k| k.camelize(:lower) }
=> {"firstName"=>"Rob", "mailingAddress"=>{"zipCode"=>"10004"}}

来源:https://github.com/rails/rails/blob/4-2-stable/activesupport/lib/active_support/core_ext/hash/keys.rb#L88

答案 2 :(得分:0)

在Rails中使用camelized属性名称对我来说似乎很奇怪,更不用说json了。我会坚持使用约定并使用下划线变量名。

但是,请看一下这个宝石:RABL。它应该能够帮助你。

答案 3 :(得分:0)

直接使用RABL Renderer,您可以传递内联模板,而不是从文件中提取它:

Rabl::Renderer.new("\nattributes :name, :description", object).render

字符串开头需要\n个字符。

答案 4 :(得分:0)

就我而言,我需要自定义一些键名。

使用

puts self.camelize_array(array:Post.all.to_a,conditions:{id: "_id",post_type: "type"})

实施

def self.camelize_array(array:,conditions: {})
    final = JSON.parse array.to_json
    final.each do |a|
        a.transform_keys! do |key| 
            if conditions.keys.include? key.to_sym
                key = conditions[key.to_sym]
            else
                key.camelize(:lower)
            end
        end
    end
    final.to_json
end