Сериализация объекта Ruby в JSON и обратно? - PullRequest
4 голосов
/ 31 декабря 2010

Я хочу сериализовать объект в JSON, записать его в файл и прочитать обратно. Теперь я ожидаю что-то вроде .net, где у вас есть json.net или что-то подобное, и вы делаете:

JsonSerializer.Serialize(obj);

и покончим с этим. Вы возвращаете строку JSON.

Как мне это сделать в Ruby? Нет рельсов, нет ActiveRecord, нет ничего. Есть ли камень, который я не могу найти?

Я установил гем JSON и вызвал:

puts JSON.generate([obj])

где obj - это объект типа:

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))

Все, что я вернусь, это:

["#<CrawlStep:0x00000001270d70>"]

Что я делаю не так?

1 Ответ

14 голосов
/ 31 декабря 2010

Самый простой способ - создать метод to_json и метод json_create. В вашем случае вы можете сделать это:

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

Затем вы сериализуетесь, вызывая JSON.dump(obj), и десериализуетесь с JSON.parse(obj). Часть данных хэша в to_json может быть любой, но мне нравится хранить ее в параметрах, которые получит new / initialize. Если есть что-то, что вам нужно сохранить, вы должны вставить это здесь, как-то разобрать и установить в json_create.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...