如果您想反序列化为您自己的类而不是 OpenStruct,则不需要做很多工作即可实现以下目标:
require 'json'
# result is an instance of MyClass
result = JSON.parse(some_json_string, object_class: MyClass)
您所要做的就是提供一个零参数构造函数并实现JSON.parse 将调用的#[]= 方法。如果你不想暴露它,让它私有就足够了:
class MyClass
attr_reader :a, :b
private
def []=(key, value)
case key
when 'a' then @a = value
when 'b' then @b = value
end
end
end
在 irb 中试用:
> JSON.parse('{"a":1, "b":2}', object_class: MyClass)
=> #<MyClass:0x00007fe00913ae98 @a=1, @b=2>
这种方法的一个警告是它只适用于平面结构,因为object_class 参数确实告诉解析器应该使用哪个类来反序列化字符串中的 JSON 对象而不是 Hash(参见类似的参数 @ 987654328@ 用于 JSON 数组的类似操作)。对于嵌套结构,这意味着您将使用同一个类来表示所有层:
> JSON.parse('{"a":1, "b":{ "a": 32 }}', object_class: MyClass)
=> #<MyClass:0x00007fb5110b2b38 @a=1, @b=#<MyClass:0x00007fb5110b2908 @a=32>>