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、配列を返すことですが、配列の個々の要素が必要です。配列をそのコンポーネントに「スプラット」し*て戻すと、値をに渡すときにStructが幸せになります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 に答える