У меня проблемы с настройкой режима: compat, как и ожидалось, с "oj". Кажется, он игнорирует метод to_hash. У меня есть простой пример (который я основал на этом посте: объекты Ruby и сериализация JSON (без Rails) ), который демонстрирует то, что я вижу.
Как вы можете видеть (извыводится в комментариях), хеш @guts, возвращаемый 'to_hash', не используется oj, когда используется ': mode =>: compat'. Кажется, я что-то упустил, или есть какая-то версия или проблема конфигурации. Спасибо!
(версия oj:
$ gem list|grep oj
oj (3.9.2)
Если это имеет значение, это на Fedora 30.)
require 'oj'
class A
public
def a
@guts[:a]
end
def b
@guts[:b]
end
def to_hash
puts "tohash"
@guts
end
def initialize(a:, b:)
@guts = {:a => a, :b => b}
end
end
a = A.new(a: "x", b: nil)
puts Oj::dump a, :indent => 2
=begin
# output:
{
"^o":"A",
"guts":{
":a":"x",
":b":null
}
}
=end
# (As an experiment I tried both with and without this line - same result:)
Oj.default_options = {:mode => :compat}
puts Oj::dump a, :indent => 2, :mode => :compat
=begin
# output:
"#<A:0x00000000021a6f10>"
=end
puts Oj::dump a, :indent => 2, :mode => :compat, use_to_hash: true
=begin
# output:
"#<A:0x00000000021a6f10>"
=end