ActiveModel :: Serializers :: JSON-如何将JSON数组从返回的字符串映射到Ruby对象的集合

问题描述 投票:1回答:1

我有适用于单个实例的代码,但我使用的API返回了数据数组。我有一个封装这些数据的类:

class Brewery
  include ActiveModel::Serializers::JSON

  attr_accessor :id, :name

  def attributes=(hash)
    hash.each { |key, value| send("#{key}=", value) }
  end

  def attributes
    instance_values
  end
end

返回的数据看起来与此类似

[
    {
        "id": 2,
        "name": "Avondale Brewing Co"
    },
    {
        "id": 44,
        "name": "Trim Tab Brewing"
    }
]

我可以使用这样的代码将单个JSON哈希封送给该类:

brewery = Brewery.new
brewery.from_json(single_brewery)

但是这不适用于数组。我是Ruby的新手,所以我不太确定要使用的功能是什么,或者至少将JSON哈希值完整地填充到可以映射from_json的数组上。

此方法有效,但似乎笨重

breweries = JSON.parse(brewery_list).map { |b|
  brewery = Brewery.new
  brewery.from_json(b.to_json)
}
ruby active-model-serializers activemodel
1个回答
1
投票

我不确定为什么您发现映射数组比较笨拙,但是您可能会将Brewery设为工厂。

class Brewery
  ...

  def self.many(brewery_list)
    JSON.parse(brewery_list).
         map(&:to_json).
         map(&Brewery.new.method(:from_json)
  end
end

并像这样使用它

breweries = Brewery.many(brewery_list)
© www.soinside.com 2019 - 2024. All rights reserved.