【发布时间】:2014-12-03 13:33:18
【问题描述】:
Newtonsoft.Json.DeserializeObject 会抛出什么异常?我想处理它们。
【问题讨论】:
标签: .net exception exception-handling json.net
Newtonsoft.Json.DeserializeObject 会抛出什么异常?我想处理它们。
【问题讨论】:
标签: .net exception exception-handling json.net
JSON.NET 定义了以下例外:
JsonException
JsonReaderExceptionJsonSerializationExceptionJsonWriterExceptionJsonSchemaException序列化或反序列化错误通常会导致JsonSerializationException。
【讨论】:
JsonSerializationException,但要确定你必须问作者或查看源代码......无论如何,如果你想确保不会错过任何东西,你可以抓住 JsonException,因为所有 JSON.NET 异常都继承自它。
JsonSerializationException。但是,如果我将其更改为根本不是 JSON(即只是一个单词甚至是 HTML),它就会抛出 JsonReaderException。
JsonConvert.DeserializeObject 反序列化只是为我抛出了一个JsonReaderException(不是JsonSerializationException)。
请注意,Json.NET's error handling documentation 显示了 API 用户通过处理错误事件而不是直接捕获异常来处理错误的策略。当您考虑到数组中可能只有一个项目可能无法反序列化时,这是有道理的,并且您可能希望以比整个集合的一个整体异常更精细的方式处理此问题。
此答案解决了您问题的“想要处理它们”部分,而没有涉及“有哪些例外”部分。正如另一个答案所示,所有 Json.NET 异常都继承自 JsonException Class,因此捕获这将是一个很好的故障保险。但是,似乎如果您想真正了解引发异常的原因,则需要阅读其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.
【讨论】: