RubyでHash to Object

Rubyで時々HashをObjectに変換したいときがあります。
そんなときはJSON文字列に一度変換し、OpenStructを用いたJSON変換をすると、ネストした構造も含めいい感じになります。

コード例

require 'json'
require 'ostruct'

hash = {
    name: {
        first: 'foo',
        last: 'bar',
    }
}

obj = JSON.parse(hash.to_json, object_class: OpenStruct)
puts obj.name.first # => "foo"

モンキーパッチで実装

下記のようにHashクラスにモンキーパッチをあてると to_o メソッドが使えるようになります。

require 'json'
require 'ostruct'

class Hash
    def to_o
        JSON.parse(to_json, object_class: OpenStruct)
    end
end

# ----------
hash = {
    name: {
        first: 'foo',
        last: 'bar',
    }
}

obj = hash.to_o
puts obj.name.first # => "foo"

ちなみに

配列でも同様のことが可能。

require 'json'
require 'ostruct'

class Array
    def to_o
        JSON.parse(to_json, object_class: OpenStruct)
    end
end

# ----------
ary = [
    { name: { first: 'foo', last: 'bar' } },
    { name: { first: 'hoge', last: 'fuga' } },
]

obj = ary.to_o
puts obj[1].name.first # => "hoge"

参考

Ruby Hash to Object with OpenStruct and JSON