2012-05-31 51 views
6

我對Ruby數組和哈希操作很新穎。Ruby:如何將數據數組轉換爲散列和json格式?

我該如何做這個簡單的轉換?

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"}] 

沒有人有什麼提示嗎?

+3

所需的輸出無效json。你的意思是一個數組? [...] – tokland

回答

14
array.map { |o| Hash[o.each_pair.to_a] }.to_json 
+0

您必須'需要'json'來獲得'to_json'函數。 –

7

struct對象數組轉換爲hash數組,然後調用to_json。您需要要求json(ruby 1.9)才能使用to_json方法。

array.collect { |item| {:id => item.id, :car => item.car} }.to_json 
2

默認編碼爲JSON使用JSON紅寶石寶石當結構實例將顯示爲一個字符串:

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"> 
+0

非常感謝。我嘗試了許多其他的解決方案,這是第一個工作......也許有一天我會真正理解它。 – Dave