Как я могу использовать to_json Руби в подклассе и включить супер-json? - PullRequest
3 голосов
/ 09 марта 2012
#!/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.

Смежный вопрос: каковы аргументы * a to_json? Я проверил документы безрезультатно.

Ответы [ 2 ]

1 голос
/ 09 марта 2012

У вас есть два хэша {:a=>'a'} и {:b=>'b'} в двух классах, они инкапсулированы, то есть скрыты от внешнего мира.Единственный способ, который я вижу, - это проанализировать строку json в хеш и объединить их, а затем преобразовать результат в 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

1 голос
/ 09 марта 2012

У меня был другой метод 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

Может быть, есть более красивое решение, но это работает.

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