In Ruby you can convert a hash into an object using OpenStruct from the Ruby Standard Library. There is a substantial overhead when creating OpenStruct. While it may seem more convenient, it will decrease your application performance if there are many such objects being created.
require 'ostruct'
h = { foo: 1, bar: 2 }
obj = OpenStruct.new(h)
obj.foo # => 1To convert an OpenStruct object back to a hash use .marshal_dump method. Since Ruby 2.0 there's also a .to_h method.
obj.marshal_dump # => {:foo=>1, :bar=>2}obj.to_h # => {:foo=>1, :bar=>2}For given hash, OpenStruct constructor only converts its top level keys.
require 'ostruct'
h = { foo: { bar: 1 } }
obj = OpenStruct.new(h)
obj.foo # => { bar: 1}
obj.foo.bar # => NoMethodError: undefined method `bar' for {:bar=>1}:HashWe can combine OpenStruct with JSON to convert nested keys as well.
require 'ostruct'
require 'json'
h = { foo: { bar: 1 } }
obj = JSON.parse(h.to_json, object_class: OpenStruct)
obj.foo # => #<OpenStruct bar=1>
obj.foo.bar # => 1You can now monkey-patch Hash object as follows:
class Hash
def to_o
JSON.parse to_json, object_class: OpenStruct
end
end
h = { foo: { bar: 1 } }
h.to_o.foo.bar # => 1