2012-05-31 6 views
6

Jestem bardzo nowy w obsłudze Ruby i haszyszach.Ruby: Jak mogę przekonwertować tablicę danych na format hash i json?

Jak mogę wykonać tę prostą transformację?

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

pożądane wyjście w json:

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

Czy ktoś ma jakieś wskazówki?

+3

żądane wyjście jest nieprawidłowe json. Masz na myśli tablicę? [...] – tokland

Odpowiedz

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

Musisz 'require 'json'', aby uzyskać funkcję' to_json'. –

7

Konwertuj tablicę obiektów w tablicy hash, a następnie wywołaj to_json. Aby korzystać z metody to_json, musisz wymagać json (ruby 1.9).

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

Domyślnie instancja Struct będzie wyświetlany jako ciąg podczas kodowania do formatu JSON za pomocą gem json Ruby

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 

wydruki

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

Nie jest to oczywiście czego chcesz.

Następnym logicznym krokiem jest upewnienie się, że instancje struct można poprawnie serializować do JSON, a także utworzyć z powrotem z JSON.

Aby to zrobić można zmienić deklarację swojej strukturze:

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 

Więc można teraz napisać następujący:

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

która drukuje

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

a także deserializowania z JSON:

YourStruct.json_create(JSON.parse('{"id": 1,"car":"toy"}')) 
# => #<struct YourStruct id=1, car="toy"> 
+0

bardzo wdzięczny za to. Próbowałem wielu innych rozwiązań i to było pierwsze, które zadziałało ... może pewnego dnia naprawdę to zrozumiem. – Dave

Powiązane problemy