将JSON反序列化为Struct?

时间:2015-10-02 18:32:06

标签: ruby json

如何将JSON字符串反序列化为API documentation而不是默认值(Struct,可以使用{{1}之类的方法将哈希键作为对象上的方法访问} s,基本上。

换句话说,我真的希望能够编写attr_accessor来访问数据。

2 个答案:

答案 0 :(得分:1)

如果Hash可以接受(这仍然可以将结构用作obj.my_json_property,即它满足原始要求),请使用以下方法:

obj.my_json_property

我尝试使用require 'json' obj = JSON.parse(json_text, object_class: OpenStruct) puts obj.my_json_property 代替,但它给了我" TypeError:分配器未定义为Struct"。但是,对于大多数(但不是全部)实际目的,OpenStruct就可以了。主要的缺点是,如果你错误拼写你的一个属性名称,你的代码运行得很好,值将只是nil /空字符串(取决于上下文)...这可能有点烦人和误导。

有点像object_class: Struct vs Hash#[](参考:OpenStruct)。

答案 1 :(得分:1)

以下是将Hash变为Struct的快捷方式:

 class Hash
    def to_struct
        s = Struct.new(*self.keys.map(&:to_sym))
        construct = map do |k,v|
            v.is_a?(Hash) ? v.to_struct : v.is_a?(Array) ? v.join(", ") : v
        end
        s.new(*construct)
    end
 end

然后你可以做以下事情:

h = {hello: 'world',foo: {bar: 'baz'}}
m = h.to_struct
#=> #<struct hello="world", foo=#<struct bar="baz">>
m.hello
#=> "world"
m.foo
#=> #<struct bar="baz">
m.foo.bar
#=> "baz"

所以在你的情况下:

require 'json'
obj = JSON.parse(json_text).to_struct

工作正常并且它也处理嵌套对象(Array需要一些明显的处理*我只是不打扰这部分,因为它不是问题的真正部分)