2012-05-31 10 views
6

Soy muy nuevo en la manipulación de matriz y hash de Ruby.Ruby: ¿Cómo puedo convertir una matriz de datos a hash y al formato json?

¿Cómo puedo hacer esta simple transformación?

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

deseada de salida en JSON:

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

¿Alguien tiene alguna pista?

+3

la salida deseada no es válida json. ¿Te refieres a una matriz? [...] – tokland

Respuesta

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

Debe 'requerir 'json'' para obtener la función' to_json'. –

7

Convierte una matriz de struct objetos en una matriz de hash, luego llama al to_json. Necesita solicitar json (ruby 1.9) para utilizar el método to_json.

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

Por defecto una instancia Struct se mostrará como una cadena cuando se codifica a JSON usando la gema JSON rubí:

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 

impresiones

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

Esto, obviamente, no es Lo que quieras.

El siguiente paso lógico es asegurarse de que las instancias de su estructura se puedan serializar correctamente a JSON, así como a las creadas desde JSON.

Para hacer esto se puede modificar la declaración de su estructura:

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 

Así que ahora puede escribir lo siguiente:

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

que imprime

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

y también Deserialize de JSON:

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

muy agradecido por esto. Probé muchas otras soluciones y esta fue la primera que funcionó ... tal vez algún día lo comprenda realmente. – Dave

Cuestiones relacionadas