2010-12-31 20 views
4

Ich möchte ein Objekt zu JSON serialisieren, in Datei schreiben und zurücklesen. Jetzt würde ich so etwas wie in .net erwarten, wo Sie haben so Json.NET oder etwas und Sie tun:Ruby-Objekt zu JSON und zurück serialisieren?

JsonSerializer.Serialize(obj); 

und mit ihr geschehen. Sie erhalten die JSON-Zeichenfolge zurück.

Wie mache ich das in Ruby? Keine Schienen, kein ActiveRecord, nichts. Gibt es ein Juwel, das ich nicht finden kann?

ich das JSON Juwel installiert und rief:

puts JSON.generate([obj]) 

wo obj ein ähnliches Objekt ist:

class CrawlStep 

    attr_accessor :id, :name, :next_step 

    def initialize (id, name, next_step) 
    @id = id 
    @name = name 
    @next_step = next_step 
    end 
end 

obj = CrawlStep.new(1, 'step 1', CrawlStep.new(2, 'step 2', nil)) 

Alle komme ich zurück ist:

["#<CrawlStep:0x00000001270d70>"] 

Was soll ich tun falsch?

Antwort

14

Der einfachste Weg ist eine to_json Methode und eine json_create Methode. In Ihrem Fall, können Sie dies tun:

class CrawlStep 
    # Insert your code here (attr_accessor and initialize) 

    def self.json_create(o) 
    new(*o['data']) 
    end 

    def to_json(*a) 
    { 'json_class' => self.class.name, 'data' => [id, name, next_step] }.to_json(*a) 
    end 
end 

Dann serialisiert werden Sie von JSON.dump(obj) und unserialize mit JSON.parse(obj) aufrufen. Der Datenteil des Hash in to_json kann alles sein, aber ich mag es, es zu den Parametern zu halten, die new/initialize bekommen werden. Wenn es noch etwas zu speichern gibt, sollten Sie es hier einfügen und es irgendwie analysieren und in json_create setzen.

+0

Funktioniert gut - danke. – sirrocco

+1

Das hat bei mir nicht funktioniert, bis ich die json gem Quelle angeschaut habe und herausgefunden habe, dass du einen Options-Hash übergeben musst, wobei 'create_additions' auf' true' gesetzt ist. z.B. 'JSON.parse (obj, create_additions: true)' oder 'JSON.load (str, nil, create_additions: true)'. Sonst ist es standardmäßig auf false gesetzt. Dies ist zumindest für Version 1.5.5 der Fall – cjross

Verwandte Themen