Que exceções Newtonsoft.Json.DeserializeObject lança?

Respostas:

124

JSON.NET define as seguintes exceções:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

Erros de serialização ou desserialização normalmente resultam em a JsonSerializationException.

Thomas Levesque
fonte
9
Obrigado, mas "normalmente"? Como posso saber com certeza quais exceções o DeseriazeObject lança?
cja
9
@cja, acho que sempre será JsonSerializationException, mas para ter certeza você teria que perguntar ao autor ou olhar o código-fonte ... De qualquer forma, você pode apenas pegar JsonExceptionse quiser ter certeza de não perder nada, já que todos os JSON As exceções do .NET são herdadas dele.
Thomas Levesque,
167
Acho que as exceções precisam ser devidamente documentadas.
KFL
Recebo os mesmos detalhes de exceção, mesmo com a classe Exception no bloco catch, você pode me ajudar a entender como elas funcionam! No meu caso agora obtendo exceção com JSON que tem unicode, ferramenta online capaz de analisá-lo corretamente, mas falhando com JSONConvert
Naga
@KFL que bom achado que você conseguiu mano
Mark S
60

Observe que a documentação de tratamento de erros do Json.NET mostra uma estratégia para o usuário da API lidar com erros tratando de eventos de erro em vez de capturar exceções diretamente. Isso faz sentido quando você considera que talvez apenas um item em uma matriz pode falhar ao desserializar, e você pode querer lidar com isso de uma forma mais granular do que uma exceção monolítica para todo o conjunto.

Esta resposta aborda a parte "quero lidar com eles" de sua pergunta sem chegar à parte "quais exceções". Como mostra outra resposta, todas as exceções Json.NET herdam da classe JsonException , portanto, pegar isso seria um bom fail-safe. No entanto, parece que se você quiser realmente entender o que causou o lançamento de uma exceção, você precisará ler sua Messagepropriedade, não manipular com base no Exceptiontipo, pois os diferentes tipos parecem ser mais orientados para a ação que você está executando do que a categoria de erro. No código de exemplo a seguir, args.ErrorContext.Erroré uma instância de Exception.

Exemplo de código da documentação:

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
fonte