Рекурсивный to_json в Ruby - PullRequest
       3

Рекурсивный to_json в Ruby

0 голосов
/ 14 августа 2010

У меня есть простой класс, который переопределяет to_json для вывода списка атрибутов в массиве -

class MyClass
  def initialize(a, b)
    @a = a
    @b = b
  end

  def to_json(*opt)
    [@a, @b].to_json(*opt)
  end
end

to_json отлично работает для экземпляра класса -

irb> m = MyClass.new(10, "abc")
irb> m.to_json
=> "[10,\"abc\"]"

Но если я помещаю объект в массив, мой пользовательский to_json НЕ вызывается -

irb> [m].to_json
=> "[{\"a\":10,\"b\":\"abc\"}]"

Я ожидал бы получить следующий вывод -

=> "[[10,\"abc\"]]"

Другой пример - если я создам другой экземпляр, который содержит первый экземпляр

irb> m2 = MyClass.new(20, m)
irb> m2.to_json
=> "[20,{\"a\":10,\"b\":\"abc\"}]"

То, что я ожидаю, это

=> "[20,[10,\"abc\"]]"

Похоже, to_json не вызывается рекурсивно. Как это решить?

Спасибо как всегда !!

Обновление

Это похоже на работу Ruby 1.9.1. Спасибо, Младен!
Мне нужно использовать 1.8.7.

1 Ответ

0 голосов
/ 14 августа 2010

Гадкий хак, чтобы заставить его работать на Ruby 1.8.7, пока кто-то не предложит лучший метод:

  • Переопределите to_xml вместо to_json.
  • Вызовите to_xml, экспортируйте его обратнохэш, а затем хэш для JSON.

например Hash.from_xml(m2.to_xml)["objects"].to_json

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