¿Qué excepciones lanza Newtonsoft.Json.DeserializeObject?

Respuestas:

124

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.

Thomas Levesque
fuente
9
Gracias, pero ¿"normalmente"? ¿Cómo puedo saber con certeza qué excepciones arroja DeseriazeObject?
cja
9
@cja, creo que siempre lo será JsonSerializationException, pero para estar seguro tendrías que preguntarle al autor o buscar en el código fuente ... De todos modos, puedes coger JsonExceptionsi quieres asegurarte de no perderte nada, ya que todo JSON Las excepciones .NET heredan de él.
Thomas Levesque
167
Creo que las excepciones deben estar debidamente documentadas.
KFL
Obtengo el mismo detalle de excepción, incluso con la clase de excepción en el bloque de captura, ¿puede ayudarme a comprender cómo funcionan? En mi caso, ahora tengo una excepción con JSON que tiene unicode, herramienta en línea capaz de analizarlo correctamente pero fallando con JSONConvert
Naga
@KFL eso es un buen pensamiento que llegaste allí hermano
Mark S
60

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 Messagepropiedad, no manejar según el Exceptiontipo, 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.Errores 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.
Karl Wenzel
fuente