Tho*_*que 107

JSON.NET定义了以下异常:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

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

  • 我认为需要对异常进行适当记录. (136认同)
  • 谢谢,但"通常"?我怎样才能确定DeseriazeObject会抛出哪些异常? (6认同)
  • @cja,我认为*它总是``JsonSerializationException`,但是要确保你不得不问作者或查看源代码......无论如何,如果你想确定你可以抓住`JsonException`不要错过任何东西,因为所有JSON.NET异常都从它继承. (6认同)
  • 异常取决于实际失败的情况,例如,我获取了一些有效的 JSON 并删除了结尾的“}”,然后它抛出了“JsonSerializationException”。然而,如果我将其更改为根本不像 JSON(即只是一个单词甚至 HTML),它会抛出“JsonReaderException”。 (5认同)

Kar*_*zel 56

请注意,Json.NET的错误处理文档显示了API用户通过处理错误事件而不是直接捕获异常来处理错误的策略.当您考虑到数组中可能只有一个项可能无法反序列化时,这是有道理的,并且您可能希望以比整个集的一个单一异常更精细的方式处理此问题.

这个答案解决了"想要处理它们"问题的一部分,而没有涉及"什么例外"部分.正如另一个答案所示,所有Json.NET异常都继承自JsonException类,因此捕获它将是一个很好的故障保护.但是,似乎如果你想真正理解是什么导致抛出异常,你需要读取它的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.
Run Code Online (Sandbox Code Playgroud)