¿Cómo puedo usar to_json de Ruby en una subclase e incluir json de super?

#!/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

produce

{"a":"a"}

como hago para que produzca

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

de manera razonable?

Estoy usando Ruby 1.9.3 y la última gema json.

Una pregunta relacionada es: ¿cuáles son los argumentos *a para to_json? He buscado en los documentos en vano.

preguntado el 09 de marzo de 12 a las 15:03

2 Respuestas

Tienes dos hash {:a=>'a'} y {:b=>'b'} en dos clases, están encapsulados, es decir, ocultos del mundo exterior. La única forma en que puedo ver es analizar la cadena json en hash y fusionarlos, luego convertir el resultado a json.

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

Pero aquí habrá una pequeña diferencia: te estás fusionando {:a=>'a',:b=>'b'} y obtuve el {"a":"a","b":"b"}

*a es un parámetro para establecer opciones para el formato json

respondido 15 mar '12, 21:03

"*a es un parámetro para establecer opciones para el formato json". Puedo ver eso, pero ¿cuáles son las opciones legales? - bebió

honestamente, no vi ningún ejemplo de usarlo - megas

Terminé teniendo un método diferente 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

Tal vez haya una solución más hermosa, pero esto funciona.

respondido 09 mar '12, 15:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.