Какие исключения выбрасывает Newtonsoft.Json.DeserializeObject?

Ответы:

124

JSON.NET определяет следующие исключения:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

Ошибки сериализации или десериализации обычно приводят к возникновению файла JsonSerializationException.

Томас Левеск
источник
9
Спасибо, а "как правило"? Как я могу точно узнать, какие исключения выдает DeseriazeObject?
cja
9
@cja, я думаю, так будет всегда JsonSerializationException, но для уверенности придется спросить автора или заглянуть в исходный код ... В любом случае, вы можете просто поймать, JsonExceptionесли хотите быть уверенным, что ничего не пропустите, поскольку все JSON От него наследуются исключения .NET.
Томас Левеск
167
Я считаю, что исключения необходимо должным образом документировать.
KFL
Я получаю те же сведения об исключении, даже с классом Exception в блоке catch, не могли бы вы помочь мне понять, как они работают! В моем случае сейчас возникает исключение с JSON, в котором есть unicode, онлайн-инструмент, способный правильно его проанализировать, но не работает с JSONConvert
Naga
@KFL, приятно подумать, что ты там, братан
Марк С.
60

Обратите внимание, что документация по обработке ошибок Json.NET показывает стратегию для пользователя API по устранению ошибок путем обработки событий ошибок, а не прямого перехвата исключений. Это имеет смысл, если учесть, что, возможно, только один элемент в массиве может не десериализоваться, и вы можете решить эту проблему более детально, чем одно монолитное исключение для всего набора.

Этот ответ касается части вашего вопроса «хочу их обработать», не касаясь части «какие исключения». Как показано в другом ответе, все исключения Json.NET наследуются от класса JsonException , поэтому отловить это было бы неплохо. Однако кажется, что если вы действительно хотите понять, что вызвало возникновение исключения, вам нужно будет прочитать его Messageсвойство, а не дескриптор в зависимости от Exceptionтипа, поскольку разные типы кажутся более ориентированными на действие, которое вы выполняете, чем категория ошибки. В следующем примере кода args.ErrorContext.Errorэто экземпляр Exception.

Пример кода из документации:

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.
Карл Венцель
источник