2011-01-23 75 views
5

我正在學習如何使用JSON gem解析和生成JSON。我很容易創建一個數據散列並將其生成到JSON中;然而,當涉及到一個類的實例(比如一個Person實例)並將其所有實例變量放在一個哈希中以將其轉換爲JSON時,我會有一個大腦放屁。使用JSON gem將自定義對象轉換爲JSON

這是我遇到的麻煩的例子:

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 

我想創建一個.to_json方法,這樣我可以把一個人對象,都轉換成JSON實例變量。我想我需要做的是將所有Person的實例變量,放在一個散列,然後調用JSON.generate(hash)。我現在正在做一個大腦放屁。那麼有人可以幫我完成to_json方法,或者提出一個更好的實現方法嗎?謝謝!

+0

如果您正在使用Rails,那麼您已經爲您完成了助手,並且您可以輕鬆地獲得想要運行的'​​.to_hash`或'​​.to_json`。看看我的來源`author_list`的行動:https://github.com/shybovycha/strong-sword/blob/master/app/controllers/quotes_controller.rb#L29 – shybovycha 2011-01-23 19:09:03

回答

11

首先,你需要確保你使用了正確的基本結構:

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

json_class關鍵是使用JSON的寶石,以確定哪些類將數據傳遞到。 *a參數包含JSON寶石所傳遞的所有參數,對於您的類通常不重要,因此您只需將它直接傳遞給哈希的to_json調用即可。下一步,存儲你的數據是一個哈希或數組的最簡單的方法:

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

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

首先可能會更快,使self.json_create方法稍微容易寫,而第二個是如果您更改了數據結構並希望加載舊的JSON對象,則可以更容易地向後兼容。