2011-01-23 10 views
5

Sto imparando come analizzare e generare JSON con la gemma JSON. Sono facilmente in grado di creare un hash di dati e di generarli in JSON; tuttavia, sto avendo una scoreggia cerebrale quando si tratta di prendere un'istanza di una classe (come un'istanza di Person) e di mettere tutte le sue variabili di istanza all'interno di un hash per essere convertite in JSON.Conversione di un oggetto personalizzato in JSON utilizzando la gemma JSON

questo è l'esempio che sto avendo problemi 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 

voglio creare un metodo .to_json in modo che possa prendere un oggetto persona ed avere tutte le sue variabili di istanza convertiti in JSON. Quello che penso di dover fare è prendere tutte le variabili di istanza di Person, metterle in un hash quindi chiamare JSON.generate(hash). Sto avendo una scoreggia cerebrale su come farlo adesso. Quindi qualcuno può aiutarmi a completare il metodo to_json o forse suggerire un modo migliore di implementarlo? Grazie!

+0

Se stai utilizzando Rails, l'helper è già pronto per te e puoi ottenere facilmente ciò che desideri eseguire " .to_hash" o " .to_json". Dai un'occhiata alla mia fonte per l'azione 'author_list': https://github.com/shybovycha/strong-sword/blob/master/app/controllers/quotes_controller.rb#L29 – shybovycha

risposta

11

In primo luogo è necessario assicurarsi di utilizzare la struttura di base a destra:

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

La chiave json_class viene utilizzata dal gioiello JSON per determinare quale classe di passare i dati. Il parametro *a include tutti gli argomenti che la gemma JSON sta trasmettendo, in genere non importante per le classi, quindi è sufficiente passare direttamente alla chiamata to_json dell'hash. Successivo modi più semplici per memorizzare i dati sono un hash o di un array:

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

o

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

Il primo potrebbe essere più veloce e rende il metodo self.json_create leggermente più facile da scrivere, mentre il secondo è un molto più facile da rendere compatibile con le versioni precedenti se si cambia la struttura dei dati e si desidera caricare vecchi oggetti JSON.

Problemi correlati