Newtonsoft.Json.DeserializeObject抛出哪些异常?


Answers:


124

JSON.NET定义以下异常:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

序列化或反序列化错误通常会导致JsonSerializationException


9
谢谢,但是“通常”?如何确定DeseriazeObject抛出哪些异常?
cja 2014年

9
@cja,我认为它永远是JsonSerializationException,但是要确保您必须询问作者或查看源代码...无论如何,您可以捕获JsonException是否想要确保不要错过任何内容,因为所有JSON .NET异常继承自它。
Thomas Levesque 2014年

167
我认为例外情况需要妥善记录。
KFL 2015年

即使使用catch块中的Exception类,我也会得到相同的异常详细信息,请您能帮助我了解它们的工作原理!就我而言,现在有具有Unicode的JSON异常,该在线工具能够正确解析它,但使用JSONConvert失败
Naga

@KFL多数民众赞成在一个很好的以为你到那里兄弟
马克S

60

请注意,Json.NET的错误处理文档显示了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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.