J'essaie de ne pas jsonifier une chaîne dans un hash. Elle a déjà été échappée.
D'après ce que j'ai lu, la manière de gérer cela pour PORO est d'écraser as_json
. J'ai donc enveloppé la chaîne dans un autre objet. Mais comme je n'ai affaire qu'à une chaîne de caractères qui mène à un objet de type stack level too deep
lorsque je renvoie l'objet. Lorsque je renvoie la chaîne de caractères déjà encodée, elle essaie évidemment de l'échapper. activesupport-6.0.3.2/lib/active_support/json/encoding.rb
def jsonify(value)
case value
when String
EscapedString.new(value)
when Numeric, NilClass, TrueClass, FalseClass
value.as_json
when Hash
Hash[value.map { |k, v| [jsonify(k), jsonify(v)] }]
when Array
value.map { |v| jsonify(v) }
else
jsonify value.as_json
end
end
Ce que je pourrais faire, c'est de modifier la méthode ci-dessus pour accepter la classe dans laquelle j'ai enveloppé la chaîne et ne rien faire.
Je suppose que l'autre option consiste à analyser la chaîne JSON pour la transformer en hachage et à la laisser suivre la procédure normale. Mais cela aurait un impact trop important sur nos performances.
Ma question est donc la suivante : existe-t-il un moyen plus élégant de dire à Rails de ne rien faire lorsqu'il rencontre un objet spécifié et qu'il essaie de le jsonifier ?
Edita:
J'utilise cette chaîne déjà jsonifiée comme :
{foo: MyStringJsonWrapper.new('{"bar":"foobar"}')}.to_json