Использование специального метода to_json во вложенных объектах

У меня есть структура данных, использующая класс Set из стандартной библиотеки Ruby. Я хотел бы иметь возможность сериализовать свою структуру данных в строку JSON.

По умолчанию Set сериализуется как массив:

>> s = Set.new [1,2,3]
>> s.to_json
=> "[1,2,3]"

Это нормально, пока вы не попытаетесь десериализовать его.

Итак, я определил пользовательский to_json метод:

class Set
  def to_json(*a)
    {
      "json_class" => self.class.name,
      "data" => {
        "elements" => self.to_a
      }
    }.to_json(*a)
  end

  def self.json_create(o)
    new o["data"]["elements"]
  end
end

Что отлично работает:

>> s = Set.new [1,2,3]
>> s.to_json
=> "{\"data\":{\"elements\":[1,2,3]},\"json_class\":\"Set\"}"

Пока я не помещу Set в хэш или что-то в этом роде:

>> a = { 'set' => s }
>> a.to_json
=> "{\"set\":[1,2,3]}"

Есть идеи, почему мой пользовательский to_json не вызывается когда Set вложен в другой объект?

9
задан mu is too short 30 July 2011 в 02:11
поделиться