2011-01-23 42 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对象,则可以更容易地向后兼容。