Quali eccezioni genera Newtonsoft.Json.DeserializeObject? Voglio gestirli.
Quali eccezioni genera Newtonsoft.Json.DeserializeObject? Voglio gestirli.
Risposte:
JSON.NET definisce le seguenti eccezioni:
JsonException
JsonReaderExceptionJsonSerializationExceptionJsonWriterExceptionJsonSchemaExceptionGli errori di serializzazione o deserializzazione generano in genere un file JsonSerializationException.
JsonSerializationException, ma per essere sicuro dovresti chiedere all'autore o controllare il codice sorgente ... Ad ogni modo, puoi semplicemente catturare JsonExceptionse vuoi essere sicuro di non perdere nulla, poiché tutti i JSON Le eccezioni .NET ereditano da esso.
Si noti che la documentazione di gestione degli errori di Json.NET mostra una strategia per l'utente API per gestire gli errori gestendo gli eventi di errore piuttosto che catturando direttamente le eccezioni. Ciò ha senso se si considera che forse solo un elemento in un array potrebbe non riuscire a deserializzare e si potrebbe desiderare di gestirlo in modo più granulare rispetto a un'eccezione monolitica per l'intero set.
Questa risposta affronta la parte "voglio gestirli" della tua domanda senza arrivare alla parte "quali eccezioni". Come mostra un'altra risposta, tutte le eccezioni Json.NET ereditano dalla classe JsonException , quindi catturarlo sarebbe un bel fail-safe. Tuttavia, sembra che se vuoi davvero capire cosa ha causato la generazione di un'eccezione, dovresti leggere la sua Messageproprietà, non gestire in base al Exceptiontipo, poiché i diversi tipi sembrano essere più orientati sull'azione che stai eseguendo rispetto a la categoria di errore. Nel seguente codice di esempio, args.ErrorContext.Errorè un'istanza di Exception.
Codice di esempio dalla documentazione:
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.