2012-05-31 22 views
6

Ben Ruby dizisi ve karma manipülasyon için çok yeni.Ruby: Bir veri dizisini karma ve json biçimine nasıl dönüştürebilirim?

Bu basit dönüşümü nasıl yapabilirim?

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

istenen json çıktı:

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

kimse herhangi bir ipucu var mı? hash arasında diziye struct nesnelerin

+3

istenilen çıktı geçerli değildir json. Bir dizi mi demek istiyorsun? [...] – tokland

cevap

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

'to_json' işlevini almak için 'json' gerektirir. –

7

dönüştürme dizisi, daha sonra to_json arayın. to_json yöntemini kullanabilmek için json (ruby 1.9) gerekir. Varsayılan olarak

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

json yakut mücevher kullanarak json için kodlama yaparken bir Struct örneği bir dize olarak görüntülenir: Bu besbelli değil

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

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 

baskılar Ne istiyorsunuz.

Bir sonraki mantıksal adım, yapılandırma örneklerinin JSON'dan yeniden oluşturulmasının yanı sıra JSON'a uygun şekilde serileştirilmesini sağlamaktır. yazdırır

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

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

ve ayrıca serisini:

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 

Yani artık şu yazabilirsiniz: Bunu yapmak için

Eğer yapının beyanı değiştirebilir JSON:

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

bunun için çok müteşekkiriz. diğer birçok çözümü denedim ve bu işe yarayan ilk şeydi ... belki bir gün bunu anlayacağım. – Dave

İlgili konular