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

163

为什么到处都没有很好的记录异常?真烦人 :( - gsscoder
4个回答

177

JSON.NET 定义了以下异常:

  • JsonException
    • JsonReaderException
    • JsonSerializationException (序列化或反序列化错误通常会导致此异常)
    • JsonWriterException
    • JsonSchemaException

15
谢谢,但是“通常”?我怎样才能确定 DeseriazeObject 抛出哪些异常呢? - cja
15
我认为它始终会是JsonSerializationException,但要确保您必须询问作者或查看源代码...无论如何,如果您希望确保不遗漏任何内容,可以捕获JsonException,因为所有的JSON.NET异常都继承自它。 - Thomas Levesque
236
我认为需要对异常进行适当的文档记录。 - KFL
5
异常取决于实际出错的地方,例如,我输入了一些有效的 JSON 数据并删除了最后一个 '}' 符号,程序会抛出 JsonSerializationException 异常。但是,如果我输入的内容完全不是 JSON 格式(比如只是一个单词或 HTML 代码),程序就会抛出 JsonReaderException 异常。 - jackofallcode
1
使用JsonConvert.DeserializeObject进行反序列化时,我遇到了一个JsonReaderException异常(而不是JsonSerializationException)。 - twinlakes
显示剩余2条评论

81
请注意,Json.NET的错误处理文档中展示了一种由API用户通过处理错误事件而不是直接捕获异常来处理错误的策略。当您考虑到数组中可能只有一个项目无法反序列化,并且您可能希望以比整个集合更细粒度的方式处理这个问题时,这种方法就很有意义。
本答案解决了您问题中“想要处理它们”部分,但没有涉及“什么异常”的部分。正如另一个答案所示,所有Json.NET异常都继承自JsonException类,因此捕获此类异常将是一个不错的安全措施。然而,似乎如果您想真正理解引发异常的原因,则需要阅读其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.

4

这是JsonReaderException。

请查看以下内容:

输入图片说明

这可以很容易地处理:

输入图片说明


1
当我尝试将数组反序列化为JObject时,我遇到了一个JsonSerializationException异常,因此这并不能捕获所有内容。 - chanban

0

这个问题是在 JsonReaderException 下处理的。

catch (JsonReaderException) 
{
  //handle your exception here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接