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