Які винятки кидає Newtonsoft.Json.DeserializeObject? Я хочу впоратися з ними.
Які винятки кидає Newtonsoft.Json.DeserializeObject? Я хочу впоратися з ними.
Відповіді:
JSON.NET визначає такі винятки:
JsonException
JsonReaderException
JsonSerializationException
JsonWriterException
JsonSchemaException
Помилки серіалізації або десеріалізації зазвичай призводять до: a JsonSerializationException
.
JsonSerializationException
, але щоб бути впевненим, вам доведеться запитати автора або зазирнути у вихідний код ... У будь-якому випадку, ви можете просто зловити, JsonException
якщо хочете бути впевненим, що нічого не пропустіть, оскільки всі JSON Винятки .NET успадковують від нього.
Зауважте, що документація щодо обробки помилок 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.