在Ruby中递归to_json

时间:2010-08-13 20:21:42

标签: ruby json

我有一个简单的类,它会覆盖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上按预期工作。谢谢Mladen!
我需要使用1.8.7。

1 个答案:

答案 0 :(得分:0)

丑陋的黑客让它在Ruby 1.8.7上运行,直到有人提出更好的方法:

  • 覆盖to_xml而不是to_json。
  • 调用to_xml,将其导出回哈希,然后哈希到json。

e.g。 Hash.from_xml(m2.to_xml)["objects"].to_json