2011-01-23 5 views
5

Я изучаю, как разбирать и генерировать JSON с жемчужиной JSON. Я легко могу создать хэш данных и сгенерировать их в JSON; тем не менее, у меня есть мозговой пердит, когда дело доходит до того, что вы принимаете экземпляр класса (например, экземпляр Person) и переставляете все его переменные экземпляра внутри хэша в JSON.Преобразование пользовательского объекта в JSON с использованием JSON gem

Это пример у меня возникли проблемы с:

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

ответ

11

Прежде всего, необходимо убедиться, что вы используете правильную базовую структуру:

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

json_class ключ используется камень JSON, чтобы определить, какой класс, чтобы передать данные. Параметр *a включает в себя все аргументы, которые передает JSON gem, как правило, неважно для ваших классов, поэтому вы просто передаете его прямо на вызов hash's to_json. Далее из простейших способов для хранения ваших данных хэш или массив:

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

или

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

Первый может быть быстрее и делает метод self.json_create немного легче писать, а второй является намного проще сделать обратную совместимость, если вы когда-либо измените структуру данных и захотите загрузить старые объекты JSON.

Смежные вопросы