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"