Jakie wyjątki zgłasza Newtonsoft.Json.DeserializeObject? Chcę się nimi zająć.
Jakie wyjątki zgłasza Newtonsoft.Json.DeserializeObject? Chcę się nimi zająć.
Odpowiedzi:
JSON.NET definiuje następujące wyjątki:
JsonException
JsonReaderException
JsonSerializationException
JsonWriterException
JsonSchemaException
Błędy serializacji lub deserializacji zazwyczaj powodują, że plik JsonSerializationException
.
JsonSerializationException
, ale dla pewności musiałbyś zapytać autora lub zajrzeć do kodu źródłowego ... Zresztą możesz po prostu złapać, JsonException
jeśli chcesz mieć pewność, że niczego nie przegapisz, bo cały JSON Wyjątki .NET dziedziczą po nim.
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 Message
właściwość, a nie obsłużyć na podstawie Exception
typu, 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.Error
jest 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.