Newtonsoft.Json.DeserializeObjectはどのような例外をスローしますか?


回答:


124

JSON.NETは、次の例外を定義しています。

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

シリアライゼーションまたはデシリアライゼーションエラーは通常、になりJsonSerializationExceptionます。


9
ありがとう、でも「普通」?DeseriazeObjectがスローする例外を特定するにはどうすればよいですか?
cja 2014年

9
@cja、私はいつもそうだと思いJsonSerializationExceptionますが、作者に尋ねるか、ソースコードを調べる必要があることを確認するために...とにかく、JsonException何かを逃さないようにしたい場合は、すべてのJSON .NET例外はそれから継承します。
Thomas Levesque 2014年

167
例外は適切に文書化する必要があると思います。
KFL

同じ例外の詳細が表示されますが、catchブロックにExceptionクラスが含まれている場合でも、それらがどのように機能するかを理解していただけますか?私の場合、現在、Unicodeを含むJSONで例外が発生していますが、オンラインツールは正しく解析できますが、JSONConvertで失敗します
Naga

@KFLそれはあなたが仲間になったと思います
マークS

60

注意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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.