¿Qué excepciones lanza Newtonsoft.Json.DeserializeObject? Quiero manejarlos.
¿Qué excepciones lanza Newtonsoft.Json.DeserializeObject? Quiero manejarlos.
Respuestas:
JSON.NET define las siguientes excepciones:
JsonException
JsonReaderException
JsonSerializationException
JsonWriterException
JsonSchemaException
Los errores de serialización o deserialización normalmente darán como resultado un archivo JsonSerializationException
.
JsonSerializationException
, pero para estar seguro tendrías que preguntarle al autor o buscar en el código fuente ... De todos modos, puedes coger JsonException
si quieres asegurarte de no perderte nada, ya que todo JSON Las excepciones .NET heredan de él.
Tenga en cuenta que la documentación de manejo de errores de Json.NET muestra una estrategia para que el usuario de la API maneje los eventos de error en lugar de detectar excepciones directamente. Esto tiene sentido si se tiene en cuenta que quizás solo un elemento de una matriz puede fallar en la deserialización, y es posible que desee manejar esto de una manera más granular que una excepción monolítica para todo el conjunto.
Esta respuesta aborda la parte "quiero manejarlos" de su pregunta sin llegar a la parte "qué excepciones". Como muestra otra respuesta, todas las excepciones de Json.NET heredan de la clase JsonException , por lo que detectar esto sería una buena prueba de fallos. Sin embargo, parece que si realmente desea comprender qué causó que se lanzara una excepción, necesitaría leer su Message
propiedad, no manejar según el Exception
tipo, ya que los diferentes tipos parecen estar más orientados a la acción que está realizando que la categoría de error. En el siguiente código de ejemplo, args.ErrorContext.Error
es una instancia de Exception
.
Código de ejemplo de la documentación:
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.