2011-01-23 17 views
5

Estoy aprendiendo a analizar y generar JSON con la joya JSON. Puedo crear fácilmente un hash de datos y generar eso en JSON; sin embargo, estoy teniendo un pedo cerebral cuando se trata de tomar una instancia de una clase (como una instancia de persona) y poner todas sus variables de instancia dentro de un hash para convertirlas en JSON.Convirtiendo un objeto personalizado en JSON utilizando la gema JSON

Este es el ejemplo que estoy teniendo problemas con:

require "json" 

class Person 

    def initialize(name, age, address) 
    @name = name 
    @age = age 
    @address = address 
    end 

    def to_json 

    end 


end 

p = Person.new('John Doe', 46, "123 Elm Street") 
p.to_json 

Quiero crear un método .to_json para que pueda tomar un objeto persona y tienen todas sus variables de instancia convertidas en JSON. Lo que creo que debo hacer es tomar todas las variables de instancia de la Persona, ponerlas en un hash y luego llamar al JSON.generate(hash). Estoy teniendo un pedo cerebral sobre cómo hacer eso ahora. Entonces, ¿puede alguien ayudarme a completar el método to_json, o quizás sugerir una mejor manera de implementarlo? ¡Gracias!

+0

Si está utilizando Rails, ese helper ya está hecho para usted y puede obtener fácilmente lo que quiere ejecutar ' .to_hash' o' .to_json'. Eche un vistazo a mi fuente para la acción 'author_list': https://github.com/shybovycha/strong-sword/blob/master/app/controllers/quotes_controller.rb#L29 – shybovycha

Respuesta

11

primer lugar usted necesita para asegurarse de que se utiliza la estructura básica derecha:

def to_json(*a) 
    { 
    'json_class' => self.class.name, 
    'data'   => Your data 
    }.to_json(*a) 
end 

La clave json_class es utilizado por la gema JSON para determinar qué clase de pasar los datos a. El parámetro *a incluye todos los argumentos por los que pasa la gema JSON, generalmente sin importancia para sus clases, por lo que solo debe pasarlo directamente a la llamada del hash to_json. A continuación las formas más sencillas para almacenar sus datos son un hash o una matriz:

'data'   => [@name, @age, @address] 

o

'data'   => { 'name' => @name, 'age' => @age, 'address' => @address 

La primera podría ser más rápido y hace que el método self.json_create poco más fácil de escribir, mientras que la segunda es una mucho más fácil hacer compatible con versiones anteriores si alguna vez cambia la estructura de datos y desea cargar objetos JSON antiguos.