与えられた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
、配列を返すことですが、配列の個々の要素が必要です。配列をそのコンポーネントに「スプラット」し*
て戻すと、値をに渡すときに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
は記号ではなく文字列である必要があることに注意してください。
事前定義された構造体である必要がない場合、これは機能します
a = Struct.new(*json.keys).new(*json.values)
演算子を使用してsplat
、配列値を引数として新しい関数に渡すことができます。
a = A.new(*{a:1,b:2}.values)