Подтвердить что ты не робот

Какие исключения делает Newtonsoft.Json.DeserializeObject?

Какие исключения делает Newtonsoft.Json.DeserializeObject? Я хочу с ними справиться.

http://james.newtonking.com/json/help/?topic=html/M_Newtonsoft_Json_JsonConvert_DeserializeObject.htm#seeAlsoToggle

4b9b3361

Ответ 1

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

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

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

Ответ 2

Обратите внимание, что Документация по обработке ошибок 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.