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