根据ruby-doc和apidock,您可以使用to_json
和json_create
序列化和反序列化例外。
但是在浪费了一些时间试图使用它们之后,我仍然没有找到方法。
致电exc.to_json
会给我一个空哈希,Exception.json_create(hash)
会给我这个错误:undefined method 'json_create' for Exception:Class
我想我可以很容易地重新创建这些功能,因为源代码可用,但我很了解我做错了什么......有什么想法吗?
答案 0 :(得分:12)
默认情况下,JSON模块不会扩展Exception。你必须require "json/add/exception"
。我不确定这是否记录在任何地方:
require "json/add/exception"
begin
nil.foo
rescue => exception
ex = exception
end
puts ex.to_json
# => {"json_class":"NoMethodError","m":"undefined method `foo' for nil:NilClass","b":["prog.rb:5:in `<main>'"]}
查看ext/json/lib/json/add
in the Ruby source以查看哪种课程以这种方式运作。如果执行require "json/add/core"
,它将为Date,DateTime,Exception,OpenStruct,Range,Regexp,Struct,Symbol,Time等加载JSON扩展。
答案 1 :(得分:1)
约旦的答案是正确的。如果您有案件,例如。您需要序列化一个Exception并将其发送到要重构它的ActiveJob,然后需要使用.as_json
方法。
require "json/add/exception"
begin
nil.foo
rescue => exception
ex = exception
end
puts ex.to_json.class
# => String
string = ex.to_json
puts Exception.json_create(string).message
# => m
puts ex.as_json.class
# => Hash
hash = ex.as_json
puts Exception.json_create(hash).message
# => undefined method `foo' for nil:NilClass
您需要阅读source code才能理解为什么Exception.json_create(string).message
返回m
的原因:)
答案 2 :(得分:0)
同样重要的是要注意,Exception.json_create
示例未保留错误类。
Exception.json_create(JSON.parse(ArgumentError.new('error').to_json))
# => #<Exception: error>
请尝试:
require "json/add/exception"
def deserialize_exception(json)
hash = JSON.parse(json)
hash['json_class'].constantize.json_create(hash)
end