【问题标题】:What exceptions does Newtonsoft.Json.DeserializeObject throw?Newtonsoft.Json.DeserializeObject 会抛出什么异常?
【发布时间】:2014-12-03 13:33:18
【问题描述】:

Newtonsoft.Json.DeserializeObject 会抛出什么异常?我想处理它们。

http://james.newtonking.com/json/help/?topic=html/M_Newtonsoft_Json_JsonConvert_DeserializeObject.htm#seeAlsoToggle

【问题讨论】:

    标签: .net exception exception-handling json.net


    【解决方案1】:

    JSON.NET 定义了以下例外:

    • JsonException
      • JsonReaderException
      • JsonSerializationException
      • JsonWriterException
      • JsonSchemaException

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

    【讨论】:

    • 谢谢,但是“通常”?如何确定 DeserizeObject 抛出了哪些异常?
    • @cja,我认为它总是JsonSerializationException,但要确定你必须问作者或查看源代码......无论如何,如果你想确保不会错过任何东西,你可以抓住 JsonException,因为所有 JSON.NET 异常都继承自它。
    • 我认为异常需要正确记录。
    • 异常取决于实际失败的原因,例如,我采用了一些有效的 JSON 并删除了结束的 '}',它抛出了 JsonSerializationException。但是,如果我将其更改为根本不是 JSON(即只是一个单词甚至是 HTML),它就会抛出 JsonReaderException
    • 使用JsonConvert.DeserializeObject 反序列化只是为我抛出了一个JsonReaderException(不是JsonSerializationException)。
    【解决方案2】:

    请注意,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.
    

    【讨论】:

      【解决方案3】:

      它的 JsonReaderException。

      检查如下:

      而且很容易处理

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-28
        • 2013-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-12
        • 2015-12-24
        相关资源
        最近更新 更多