如何在子类中使用Ruby的to_json并包含super的json?

时间:2012-03-09 15:22:21

标签: ruby json

#!/usr/bin/env ruby

require 'json'

class A
  def to_json(*a)
    { :a => 'a' }.to_json(*a)
  end
end

class B < A
  def to_json(*a)
    super({ :b => 'b' })
  end
end

puts B.new.to_json

产生

{"a":"a"}

如何制作

{"a":"a", "b":"b"}

以合理的方式?

我正在使用Ruby 1.9.3和最新的json gem。

一个相关的问题是:to_json的参数是什么?我搜索过的文档无济于事。

2 个答案:

答案 0 :(得分:1)

我最终得到了一个不同的方法json_map。

#!/usr/bin/env ruby

require 'json'

class A
  def to_json(*a)
    json_map.to_json(*a)
  end

  def json_map
    { :a => 'a' }
  end
end

class B < A
  def json_map
    map = super
    map[:b] = 'b'
    map
  end
end

puts B.new.to_json

也许有一个更美丽的解决方案,但这很有效。

答案 1 :(得分:1)

在两个类中有两个哈希{:a=>'a'}{:b=>'b'},它们被封装,即从外部世界隐藏。我能看到的唯一方法是将json字符串解析为hash并合并它们,然后将结果转换为json。

class B < A
  def to_json(*a)
    JSON.parse(super).merge({:b=>'b'}).to_json
  end
end

但是这里差异很小:你正在合并{:a=>'a',:b=>'b'}并得到{"a":"a","b":"b"}

*a是为json格式设置选项的参数