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]
)そのまま配列のオブジェクトとしてアクセスできるようになる。