Які винятки кидає Newtonsoft.Json.DeserializeObject?


Відповіді:


124

JSON.NET визначає такі винятки:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

Помилки серіалізації або десеріалізації зазвичай призводять до: a JsonSerializationException.


9
Дякую, але "типово"? Як я можу зрозуміти, які винятки кидає DeseriazeObject?
cja

9
@cja, я думаю, це буде завжди JsonSerializationException, але щоб бути впевненим, вам доведеться запитати автора або зазирнути у вихідний код ... У будь-якому випадку, ви можете просто зловити, JsonExceptionякщо хочете бути впевненим, що нічого не пропустіть, оскільки всі JSON Винятки .NET успадковують від нього.
Томас Левеск

167
Я думаю, що винятки мають бути належним чином задокументовані.
KFL

Я отримую ту саму деталь виключення, навіть якщо клас Exception в блоці вилову, чи можете ви мені допомогти зрозуміти, як вони працюють! У моєму випадку зараз отримуємо виняток із JSON, у якого є unicode, онлайн-інструмент, здатний правильно його розібрати, але не вдалося виконати JSONConvert
Naga

@KFL приємно подумати, що ти потрапив до цього брату
Марк S

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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.