如何将JSON字符串反序列化为API documentation而不是默认值(Struct,可以使用{{1}之类的方法将哈希键作为对象上的方法访问} s,基本上。
换句话说,我真的希望能够编写attr_accessor
来访问数据。
答案 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
需要一些明显的处理*我只是不打扰这部分,因为它不是问题的真正部分)