【问题标题】:Rails: How to convert hash of array of objects to jsonRails:如何将对象数组的哈希转换为 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

标签: ruby-on-rails json ruby


【解决方案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)
    

    自动序列化整个集合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      相关资源
      最近更新 更多