2014-10-08 3 views

risposta

55

JSON.NET definisce le seguenti eccezioni:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

errori di serializzazione o deserializzazione tipicamente risultare in una JsonSerializationException.

+5

Grazie, ma "in genere"? Come posso sapere con certezza quali eccezioni vengono generate da DeseriazeObject? – cja

+4

@cja, io * penso * sarà sempre 'JsonSerializationException', ma per essere sicuro dovresti chiedere all'autore o guardare nel codice sorgente ... Comunque, puoi semplicemente prendere' JsonException' se vuoi essere certo di non perdere nulla, dal momento che tutte le eccezioni JSON.NET ne ereditano. –

+62

Penso che le eccezioni debbano essere adeguatamente documentate. – KFL

27

Si noti che Json.NET's error handling documentation mostra una strategia per l'utente API per gestire gli errori gestendo gli eventi di errore anziché intercettare direttamente le eccezioni. Ciò ha senso quando 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 risolve la parte "voglio gestirli" della domanda senza arrivare alla parte "quali eccezioni". Come mostra un'altra risposta, tutte le eccezioni JSON.NET ereditano da JsonException Class, quindi catturare questo sarebbe un buon fail-safe. Tuttavia, sembra che se vuoi capire veramente cosa ha causato la generazione di un'eccezione, dovresti leggere la sua proprietà Message, non gestirla in base al tipo Exception, poiché i diversi tipi sembrano essere più orientati all'azione che sei eseguendo rispetto alla categoria di errore. Nel codice di esempio, il args.ErrorContext.Error è un tipo 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.