2016-05-27 22 views
3

ruby-docapidockによると、to_jsonjson_createを使用して例外をシリアライズしてデシリアライズすることができます。例外のシリアル化方法

しかし、それらを使用しようとするのに時間を無駄にした後、私はまだ方法を見つけていません。

exc.to_jsonを呼び出すと、私は空のハッシュを与え、Exception.json_create(hash)は私に、このエラーを与える:undefined method 'json_create' for Exception:Class

私はソースが提供されていますので、私は簡単にこれらの機能を再作成することができると思いますが、私はむしろ、私が間違ってやっているのか理解したいです... 何か案が?

+0

これをよりよく処理するには、Exceptionクラスを拡張する必要があります。例外のための 'JSON.dump(e)'は何をしますか? – tadman

+0

'JSON.dump(e)'は私に同じ空のハッシュを与えます(railsコンソールでは、しかしirbでエラーを投げます)。 私は実際にリンクにあるソースコードを使用することができますが、これは正常に動作するようです。私が理解していないことは、それらの機能がすでに存在するはずだが、なぜそれをやらなければならないのかということだ。 – user3033467

+0

あなたは 'json''を要求しなければなりません、そうしましたか?それでも、 'to_json'はデフォルトでのみメッセージをシリアライズします。ミックスにRailsを追加すると(私はRailsタグが見えませんでした)、さらに問題が複雑になるかもしれません。 –

答えて

8

JSONモジュールは、デフォルトで例外を拡張しません。あなたは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拡張がロードされます。

+0

私の最初のスタックの質問は本当に愚かであることが判明しました...回答ありがとう – user3033467

+0

それは本当に愚かな質問ではありません。私が言ったように、それは文書化されていないようです。私はRubyのソースを掘り下げてそれを理解しました。タッドマンとDaveNewtonは頭の上から答えを知らなかったし、彼らは私と同じくらい多くの担当者を持っていた! –

+0

まったく馬鹿ではない、私は何年も前からルビーを使っていて、これを分かっていないだろう。 – jrochkind

関連する問題