Quali eccezioni genera Newtonsoft.Json.DeserializeObject? Voglio gestirli.
Quali eccezioni genera Newtonsoft.Json.DeserializeObject? Voglio gestirli.
Risposte:
JSON.NET definisce le seguenti eccezioni:
JsonException
JsonReaderException
JsonSerializationException
JsonWriterException
JsonSchemaException
Gli 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 JsonException
se 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 Message
proprietà, non gestire in base al Exception
tipo, 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.