Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-使用camelize将模型序列化为JSON_Ruby On Rails_Json_Serialization_Activerecord - Fatal编程技术网

Ruby on rails Rails-使用camelize将模型序列化为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

我需要将一个模型序列化为json,并对所有的键进行骆驼化。我看到to_xml中有一个选项允许驼峰大小写。我似乎无法强迫json序列化返回一个骆驼化的散列。这在rails中是可能的吗?

我觉得在rails中使用camellized属性名很奇怪,更不用说json了。我会坚持惯例,使用带下划线的变量名


然而,看看这个宝石:。它应该能够帮助您解决问题。

直接使用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