Newtonsoft.Json.DeserializeObject抛出什么异常?

JSON.NET定义了以下情况除外:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

序列化和反序列化错误通常将导致一个JsonSerializationException

+5

谢谢,但 “典型地”?我怎样才能确定DeseriazeObject抛出哪些异常? – cja 2014-10-09 10:15:02

+4

@cja,我认为*它总是会是'JsonSerializationException',但要确保您必须问作者或查看源代码......无论如何,如果您想成为“JsonException”一定不要错过任何东西,因为所有的JSON.NET异常都会从中继承。 – 2014-10-09 10:29:57

+62

我认为例外需要妥善记录。 – KFL 2015-12-03 19:19:45

请注意,Json.NET's error handling documentation显示了一种API用户通过处理错误事件而不是直接捕获异常来处理错误的策略。当您考虑可能只有一个数组中的某个项目可能无法反序列化时,这是有道理的,您可能希望以比整个集合中的一个整体异常更细化的方式处理此问题。

这个答案解决了“想要处理它们”这个问题的一部分,而没有得到“什么是例外”部分。正如另一个答案所示,所有Json.NET异常从JsonException Class继承,因此捕获这将是一个很好的故障安全。然而,如果你想真正理解是什么导致抛出异常,你需要阅读它的Message属性,而不是基于Exception类型来处理,因为不同的类型似乎更关注于你所采取的动作表现比错误类别。在示例代码中,args.ErrorContext.ErrorException类型。从文档

示例代码:

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.