Jakie wyjątki zgłasza Newtonsoft.Json.DeserializeObject?

Odpowiedzi:

124

JSON.NET definiuje następujące wyjątki:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

Błędy serializacji lub deserializacji zazwyczaj powodują, że plik JsonSerializationException.

Thomas Levesque
źródło
9
Dzięki, ale „zazwyczaj”? Jak mogę się dowiedzieć, które wyjątki zgłasza DeseriazeObject?
cja
9
@cja, myślę, że zawsze będzie JsonSerializationException, ale dla pewności musiałbyś zapytać autora lub zajrzeć do kodu źródłowego ... Zresztą możesz po prostu złapać, JsonExceptionjeśli chcesz mieć pewność, że niczego nie przegapisz, bo cały JSON Wyjątki .NET dziedziczą po nim.
Thomas Levesque
167
Uważam, że wyjątki należy odpowiednio udokumentować.
KFL
Otrzymuję te same szczegóły wyjątku, nawet z klasą wyjątku w bloku catch. Czy możesz mi pomóc zrozumieć, jak one działają! W moim przypadku teraz dostaję wyjątek od JSON, który ma Unicode, narzędzie online, które jest w stanie przeanalizować go poprawnie, ale nie działa z JSONConvert
Naga
@KFL to miło, że się tam dostałeś, bracie
Mark S
60

Należy zauważyć, że dokumentacja obsługi błędów Json.NET przedstawia strategię dla użytkownika interfejsu API radzenia sobie z błędami, obsługując zdarzenia błędów, a nie bezpośrednio przechwytując wyjątki. Ma to sens, gdy weźmiesz pod uwagę, że być może tylko jeden element w tablicy może nie zostać zdeserializowany, i możesz chcieć obsłużyć to w bardziej szczegółowy sposób niż jeden monolityczny wyjątek dla całego zestawu.

Ta odpowiedź dotyczy części pytania „chcę sobie z nimi poradzić”, bez przechodzenia do części „jakie wyjątki”. Jak pokazuje inna odpowiedź, wszystkie wyjątki Json.NET dziedziczą po klasie JsonException , więc przechwycenie tego byłoby dobrym zabezpieczeniem przed awarią. Jednak wydaje się, że jeśli chcesz naprawdę zrozumieć, co spowodowało wyrzucenie wyjątku, musisz przeczytać jego Messagewłaściwość, a nie obsłużyć na podstawie Exceptiontypu, ponieważ różne typy wydają się być bardziej zorientowane na akcję, którą wykonujesz niż kategoria błędu. W poniższym przykładowym kodzie args.ErrorContext.Errorjest wystąpieniem Exception.

Przykładowy kod z dokumentacji:

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
źródło