Rails:如何将对象数组的哈希转换为 json
Posted
技术标签:
【中文标题】Rails:如何将对象数组的哈希转换为 json【英文标题】:Rails: How to convert hash of array of objects to json 【发布时间】:2021-12-03 16:20:18 【问题描述】:我是一名 java 和 Js 开发人员,所以我对 rails 和 ruby 完全陌生。在我的一个项目中,我使用 rails 来使用 api 并返回到 js。我正在将 api 响应转换为 ruby 中的模型。
现在,格式为KEY1=>[array of objects(my model)], KEY2=>[array of objects(my model)]
模型的键也在snake_case中。我的要求是循环遍历并使用驼峰键将其转换为 JSON。
转模型后的Api响应: KEY1=>[@person_name:"abc", @person_id="123"],KEY2:[@personName:"bca", @person_id="231"]
所需输出: KEY1:[personName:"abc", personId:"123"],KEY2:[personName:"bca",personId:"231"]
到目前为止,我尝试使用 .map 和 .transform_values,但不知道我做错了什么。
感谢任何帮助。
【问题讨论】:
次要注意:您想要的输出不是有效的 JSON 只需使用 JSON.generate 将您的哈希转换为 JSON。 ruby-doc.org/stdlib-3.0.0/libdoc/json/rdoc/… 它是否负责将密钥转换为驼峰式? @dbugger @AbhishekP - 澄清一下,您想将模型列表转换为 json,并使用 camelcase 转换所有键? 是的,正是@BroiSatse 【参考方案1】:你可以这样做:
KEY1: Person.where(...).select(:name, :id).map |p| Hash[p.serializable_hash.map |key, value| ["#p.model_name.name.downcase#key.capitalize", value] ] ,
KEY2: Person.where(...).select(:name, :id).map |p| Hash[p.serializable_hash.map |key, value| ["#p.model_name.name.downcase#key.capitalize", value] ]
.to_json
【讨论】:
【参考方案2】:您可以将以下内容添加到您的 ApplicationRecord
类中:
class ApplicationRecord < ActiveRecord::Base
def serializable_hash(options = )
hash = super
return hash unless options[:camelize]
hash.deep_transform_keys |key| key.to_s.camelize(options[:camelize])
end
end
这将允许您在几乎任何对象上调用to_json(camelize: :lower)
:
KEY1: Person.where(...),
KEY2: Person.where(...),
.to_json(camelize: :lower)
自动序列化整个集合
【讨论】:
以上是关于Rails:如何将对象数组的哈希转换为 json的主要内容,如果未能解决你的问题,请参考以下文章
ruby Rails'index_by:将数组转换为哈希的简便方法