Newtonsoft.Json.DeserializeObjectはどのような例外をスローしますか?扱いたい。
Newtonsoft.Json.DeserializeObjectはどのような例外をスローしますか?扱いたい。
回答:
JSON.NETは、次の例外を定義しています。
JsonException
JsonReaderException
JsonSerializationException
JsonWriterException
JsonSchemaException
シリアライゼーションまたはデシリアライゼーションエラーは通常、になりJsonSerializationException
ます。
JsonSerializationException
ますが、作者に尋ねるか、ソースコードを調べる必要があることを確認するために...とにかく、JsonException
何かを逃さないようにしたい場合は、すべてのJSON .NET例外はそれから継承します。
注意Json.NETのエラーがドキュメントハンドリングショーにエラーイベントを処理するのではなく、直接例外をキャッチしてエラーに対処するためのAPIのユーザーのための戦略を。これは、おそらく配列内の1つの項目のみが逆シリアル化に失敗する可能性があり、セット全体に対して1つのモノリシックな例外よりも細かい方法でこれを処理したいと考える場合に意味があります。
この回答は、「例外」の部分に到達することなく、質問の「それらを処理したい」部分に対処します。別の回答が示すように、すべてのJson.NET例外はJsonExceptionクラスを継承しているため、これをキャッチするとフェイルセーフになるでしょう。ただし、例外がスローされた原因を本当に理解したい場合Message
は、Exception
タイプに基づくハンドルではなく、そのプロパティを読み取る必要があります。異なるタイプは、実行しているアクションよりも指向性が高いように見えるためです。エラーカテゴリ。次のコード例でargs.ErrorContext.Error
は、はのインスタンスですException
。
ドキュメントのサンプルコード:
List<string> errors = new List<string>();
List<DateTime> c = JsonConvert.DeserializeObject<List<DateTime>>(@"[
'2009-09-09T00:00:00Z',
'I am not a date and will error!',
[
1
],
'1977-02-20T00:00:00Z',
null,
'2000-12-01T00:00:00Z'
]",
new JsonSerializerSettings
{
Error = delegate(object sender, ErrorEventArgs args)
{
errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
},
Converters = { new IsoDateTimeConverter() }
});
// 2009-09-09T00:00:00Z
// 1977-02-20T00:00:00Z
// 2000-12-01T00:00:00Z
// The string was not recognized as a valid DateTime. There is a unknown word starting at index 0.
// Unexpected token parsing date. Expected String, got StartArray.
// Cannot convert null value to System.DateTime.