3

给定一个 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

4

3 回答 3

5

尝试使用:

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必须是字符串,而不是符号。

于 2013-02-18T18:42:08.510 回答
3

如果它不必是预定义的结构,这将起作用

a = Struct.new(*json.keys).new(*json.values)
于 2013-02-18T18:49:18.123 回答
1

您可以使用splat运算符将​​数组值作为参数传递给新函数。

a = A.new(*{a:1,b:2}.values)
于 2013-02-18T18:44:28.837 回答