三蔵開発メモ

Web開発やインフラ関連のメモを共有します

RubyでネストしたHashをオブジェクト化する方法

Ruby2系までは、ネストした階層のハッシュをオブジェクト化するには、JSON化してOpenStructを使うのが簡単だったが、 Ruby3.0からOpenStructが非推奨になってしまったため、Structでやる必要になって少しはまったのでメモ。

response = {
 users: [
    profile: {
      {
        birthday:20010101
      }
    }
  ]  
}

こんな感じのデータをオブジェクト化する場合は、

response_obj = JSON.parse(response, object_class: OpenStruct)

こうすればオブジェクト化できて、

p response_obj.users.first.profile.birthday
# 20010101

こんな感じでアクセスできるようになっていたが、OpenStructが使えないので、Structで作る必要がある。

birthday = Struct.new(:birthday).new(20010101)
profile = Struct.new(:profile).new(birthday)
response_obj = Struct.new(:users).new([profile])

配列の場合はnewをする時に配列の状態で入れてあげれば(今回の場合は[profile])そのまま配列のオブジェクトとしてアクセスできるようになる。