9

私はRuby配列とハッシュ操作に非常に慣れていません。

この単純な変換を行うにはどうすればよいですか?

array = [#<struct id=1, car='red'>, #<struct id=2, car='yellow'>, #<struct id=3, car='green'>]

json での目的の出力:

[{id : 1, car : 'red'} , {id:2, car :'yellow'} ,{id:3 , car: "green"}]

誰にもヒントはありますか?

4

3 に答える 3

16
array.map { |o| Hash[o.each_pair.to_a] }.to_json
于 2012-05-31T08:02:58.560 に答える
7

structオブジェクトの配列を の配列に変換してからhash、 を呼び出しますto_json。このメソッドjsonを使用するには、require (ruby 1.9) が必要です。to_json

array.collect { |item| {:id => item.id, :car => item.car} }.to_json
于 2012-05-31T08:01:11.260 に答える
2

デフォルトでは、json ruby​​ gemを使用してjsonにエンコードすると、Structインスタンスが文字列として表示されます。

require 'json'
array = [#<struct id=1, car='red'>, #<struct id=2, car='yellow'>, #<struct id=3, car='green'>] # assuming real structure code in the array
puts array.to_json

プリント

["#<struct id=1, car='red'>", "#<struct id=2, car='yellow'>", "#<struct id=3, car='green'>"]

これは明らかにあなたが望むものではありません。

次の論理的な手順は、構造体インスタンスがJSONに適切にシリアル化され、JSONから作成されていることを確認することです。

これを行うには、構造の宣言を変更できます。

YourStruct = Struct.new(:id, :car)
class YourStruct
  def to_json(*a)
    {:id => self.id, :car => self.car}.to_json(*a)
  end

  def self.json_create(o)
    new(o['id'], o['car'])
  end
end

したがって、次のように書くことができます。

a = [ YourStruct.new(1, 'toy'), YourStruct.new(2, 'test')]
puts a.to_json

印刷する

[{"id": 1,"car":"toy"},{"id": 2,"car":"test"}]

また、JSONから逆シリアル化します。

YourStruct.json_create(JSON.parse('{"id": 1,"car":"toy"}'))
# => #<struct YourStruct id=1, car="toy">
于 2012-05-31T08:10:38.307 に答える