Pengecualian apa yang dilemparkan oleh Newtonsoft.Json.DeserializeObject?

Jawaban:

124

JSON.NET mendefinisikan pengecualian berikut:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

Kesalahan serialisasi atau deserialisasi biasanya akan menghasilkan file JsonSerializationException.

Thomas Levesque
sumber
9
Terima kasih, tapi "biasanya"? Bagaimana saya bisa mengetahui dengan pasti pengecualian mana yang dilontarkan DeseriazeObject?
cja
9
@cja, saya pikir akan selalu begitu JsonSerializationException, tetapi untuk memastikan Anda harus bertanya kepada penulis atau melihat ke kode sumber ... Bagaimanapun, Anda dapat menangkapnya JsonExceptionjika Anda ingin memastikan tidak melewatkan apa pun, karena semua JSON Pengecualian .NET mewarisi darinya.
Thomas Levesque
167
Saya pikir pengecualian perlu didokumentasikan dengan benar.
KFL
Saya mendapatkan detail pengecualian yang sama, bahkan dengan kelas Exception di blok tangkapan, dapatkah Anda membantu saya memahami cara kerjanya! Dalam kasus saya sekarang mendapatkan pengecualian dengan JSON yang memiliki unicode, alat online dapat menguraikannya dengan benar tetapi gagal dengan JSONConvert
Naga
@KFL thats a nice think u got there
Mark S
60

Perhatikan bahwa dokumentasi penanganan kesalahan Json.NET menunjukkan strategi bagi pengguna API untuk menangani kesalahan dengan menangani kejadian kesalahan daripada langsung menangkap pengecualian. Ini masuk akal jika Anda mempertimbangkan bahwa mungkin hanya satu item dalam larik yang gagal melakukan deserialisasi, dan Anda mungkin ingin menangani ini dengan cara yang lebih terperinci daripada satu pengecualian monolitik untuk seluruh rangkaian.

Jawaban ini membahas bagian "ingin menanganinya" dari pertanyaan Anda tanpa sampai ke bagian "pengecualian apa". Seperti yang ditunjukkan jawaban lain, semua pengecualian Json.NET mewarisi dari JsonException Class , jadi menangkap ini akan menjadi cara yang aman untuk gagal. Namun, tampaknya jika Anda ingin benar-benar memahami apa yang menyebabkan pengecualian dilempar, Anda perlu membaca Messagepropertinya, bukan menangani berdasarkan Exceptionjenisnya, karena jenis yang berbeda tampaknya lebih berorientasi pada tindakan yang Anda lakukan daripada kategori kesalahan. Dalam kode contoh berikut, args.ErrorContext.Erroradalah turunan dari Exception.

Contoh kode dari dokumentasi:

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.
Karl Wenzel
sumber