2012-05-31 3 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

'to_json' 함수를 얻으려면''json ''을 요구해야합니다. –

7

struct의 배열을 hash 배열로 변환 한 다음 to_json을 호출하십시오. to_json 메소드를 사용하려면 json (루비 1.9)이 필요합니다. 기본적으로

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

json으로 루비 보석 사용하여 JSON으로 인코딩 할 때 구조체 인스턴스가 문자열로 표시됩니다 :이 분명하지

["#<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 

인쇄 당신이 원하는.

다음 논리적 단계는 구조체 인스턴스를 JSON으로 올바르게 직렬화하고 JSON에서 다시 만들 수 있는지 확인하는 것입니다. 인쇄

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

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

또한이 역 직렬화 :

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 

그래서 당신은 이제 다음을 작성할 수 있습니다 :이 작업을 수행하려면

당신은 당신의 구조의 선언을 변경할 수 있습니다 JSON :

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

매우 감사드립니다. 나는 다른 많은 해결책을 시도하고 이것은 일한 최초의 사람이었습니다 ... 어쩌면 언젠가는 실제로 그것을 이해할 것입니다. – Dave

관련 문제