3 votes

Comment puis-je utiliser to_json de Ruby dans une sous-classe et inclure le 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

produit

{"a":"a"}

Comment faire pour qu'il produise

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

de manière raisonnable ?

J'utilise Ruby 1.9.3 et la dernière gem json.

Une question connexe est : quels sont les arguments *a à to_json ? J'ai parcouru la documentation en vain.

1voto

dfrankow Points 2983

J'ai fini par avoir une méthode différente 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

Il y a peut-être une solution plus belle, mais celle-ci fonctionne.

1voto

megas Points 10549

Vous avez deux hachages {:a=>'a'} y {:b=>'b'} dans deux classes, elles sont encapsulées, c'est-à-dire cachées du monde extérieur. Le seul moyen que je vois est d'analyser la chaîne json en hash et de les fusionner, puis de convertir le résultat en json.

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

Mais il y aura une petite différence : vous fusionnez {:a=>'a',:b=>'b'} et a obtenu le {"a":"a","b":"b"}

*a est un paramètre permettant de définir les options pour le format json

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X