Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby: JSON.parse時に任意のClassのオブジェクトとして取得する方法

JSON.parseの結果は基本的にはHashになると思うのですが、任意のClassのオブジェクトで取得したい場合に、JSON.parseの引数object_classを利用すると簡単に実現出来ることを知らなかったのでメモしておきます📝

やり方は以下の通りでdef []=(key, value)を持つ任意のClassを作成してあげて、JSON.parseの引数object_classにそのClassを渡して上げるだけです。

require 'json'

json = <<~JSON
[
  {
    "title": "foo 1",
    "body": "bar 1"
  },
  {
    "title": "foo 2",
    "body": "bar 2"
  }
]
JSON

class Article
  attr_accessor :title, :body

  def initializer(title, body)
    @title = title
    @body = body
  end

  def []=(key, value)
    instance_variable_set("@#{key}", value)
  end
end

p JSON.parse(json, object_class: Article)
# => [#<Article:0x00007fcad21f46c8 @title="foo 1", @body="bar 1">, #<Article:0x00007fcad21f44c0 @title="foo 2", @body="bar 2">]

Ruby便利ですね✨

参考

docs.ruby-lang.org