Quali eccezioni genera Newtonsoft.Json.DeserializeObject?


Risposte:


124

JSON.NET definisce le seguenti eccezioni:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

Gli errori di serializzazione o deserializzazione generano in genere un file JsonSerializationException.


9
Grazie, ma "tipicamente"? Come posso sapere con certezza quali eccezioni genera DeseriazeObject?
cja

9
@cja, penso che lo sarà sempre 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.
Thomas Levesque

167
Penso che le eccezioni debbano essere adeguatamente documentate.
KFL

Ottengo lo stesso dettaglio delle eccezioni, anche con la classe Exception nel blocco catch, puoi aiutarmi a capire come funzionano! Nel mio caso in questo momento ottengo un'eccezione con JSON che ha unicode, strumento online in grado di analizzarlo correttamente ma non riesce con JSONConvert
Naga

@KFL è un bel pensiero che ci sei arrivato fratello
Mark S

60

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.