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:将数组转换为哈希的简便方法

如何将数组转换成JSON-CSDN论坛

如何在 Rails 中将 Javascript 对象转换为 JSON?

如何将 JSON 转换为 Ruby 哈希

Ruby 将对象转换为哈希

如何对 Javascript 对象进行排序,或将其转换为数组?