Ruby on rails Rails-使用camelize将模型序列化为JSON
我需要将一个模型序列化为json,并对所有的键进行骆驼化。我看到to_xml中有一个选项允许驼峰大小写。我似乎无法强迫json序列化返回一个骆驼化的散列。这在rails中是可能的吗?我觉得在rails中使用camellized属性名很奇怪,更不用说json了。我会坚持惯例,使用带下划线的变量名Ruby on rails Rails-使用camelize将模型序列化为JSON,ruby-on-rails,json,serialization,activerecord,Ruby On Rails,Json,Serialization,Activerecord,我需要将一个模型序列化为json,并对所有的键进行骆驼化。我看到to_xml中有一个选项允许驼峰大小写。我似乎无法强迫json序列化返回一个骆驼化的散列。这在rails中是可能的吗?我觉得在rails中使用camellized属性名很奇怪,更不用说json了。我会坚持惯例,使用带下划线的变量名 然而,看看这个宝石:。它应该能够帮助您解决问题。直接使用RABL渲染器,您可以传递内联模板,而不是从文件中获取它: Rabl::Renderer.new("\nattributes :name, :des
然而,看看这个宝石:。它应该能够帮助您解决问题。直接使用RABL渲染器,您可以传递内联模板,而不是从文件中获取它:
Rabl::Renderer.new("\nattributes :name, :description", object).render
\n
字符在字符串开头是必需的。我也有类似的问题。经过一点研究之后,我用一个助手包装了ActiveModel方法,该助手可以计算散列键。然后,我会将模块包括在相关模型中:
#lib/camel_json.rb
模块JSON
def as_json(选项)
camelize_键(超级(选项))
结束
私有的
def camelize_密钥(散列)
values=hash.map do |键,值|
[键。camelize(:较低),值]
结束
散列[值]
结束
结束
#app/models/post.rb
需要“camel_json”
类Post
这对我们的情况非常有效,这是相对简单的。但是,如果您使用的是JBuilder,显然有一种配置可以将camel case设置为默认值:如果您使用的是rails,请跳过添加的依赖项并使用
哈希#deep_transform_key
。它还有另外一个好处,那就是对嵌套键进行骆驼化(如果您正在执行类似于user.as\u json(includes::my\u associated\u model)
的操作,则很方便):
来源:对于我的案例,我需要自定义一些键名 用法
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
伯特-你很在行。谢谢你也看了这个问题。我试图使rails json api对于另一端的javascript开发人员来说尽可能干净。RABL看起来可以节省我很多时间!谢谢javascript按惯例使用camelcase,json属性也被camelcase化难道不是更有意义吗?提示:如果您使用的是类似于camelcase的东西,而不喜欢RABL的样式响应,尝试对对象使用
object@thing=>false
,对child和collections使用:object\u root=>false
,根据伯特的建议,我们选择了RABL。更高兴的是,这里有一个关于RABL的教程:您是如何让RABL返回camelized json的?出于纯粹的科学原因,我使用了这段代码,但不得不修改它以检查键和值是否为零。把它放在values=hash.map do | key,value |
小改动中,我只是想提一下。注意,这个实现不会转换嵌套哈希的键。例如,user.as_-json(仅:[:名字],include::mailing\u address)
将离开zip\u code
snake-cased:{“firstName”=>“Alan”,“mailingAddress”=>{“id”:1,“zip\u code”=>“10004”
。
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