给定一个 JSON 对象
{"a": 1, "b":2}
以及从结构派生的值对象:
class A < Stuct.new(:a, :b)
end
我将如何创建一个具有 JSON 值的 A 实例?
我在尝试:
a = A.new(JSON.parse({a:1,b:2}.to_json).values)
=> #<struct A a=[1, 2], b=nil>
但我希望 a->1 和 b->2
给定一个 JSON 对象
{"a": 1, "b":2}
以及从结构派生的值对象:
class A < Stuct.new(:a, :b)
end
我将如何创建一个具有 JSON 值的 A 实例?
我在尝试:
a = A.new(JSON.parse({a:1,b:2}.to_json).values)
=> #<struct A a=[1, 2], b=nil>
但我希望 a->1 和 b->2
尝试使用:
a = A.new(*JSON[json].values)
a.class # => A < #<Class:0x00000102955828>
问题是values
返回一个数组,但您需要数组的各个元素。使用*
“splats”数组回到它的组件中,当你将值传递给new
.
编辑:
如果 JSON 和 Struct 的顺序不匹配,这将失败!
这会强制值的顺序。
a = A.new(*JSON[json].values_at('a', 'b'))
{
:a => 1,
:b => 2
}
a.class # => A < #<Class:0x00000102955828>
JSON 保留哈希插入顺序,Ruby 也是如此,因此,由 Ruby 渲染和解析的 JSON 将是正确的。由不保留顺序的东西呈现的 JSON 可能是一个问题,但可以values_at
解决问题。
请注意,JSON 将符号转换为字符串,因此传递给的键values_at
必须是字符串,而不是符号。
如果它不必是预定义的结构,这将起作用
a = Struct.new(*json.keys).new(*json.values)
您可以使用splat
运算符将数组值作为参数传递给新函数。
a = A.new(*{a:1,b:2}.values)