从Json.Net中的JsonReaderException查找无效值

问题描述 投票:2回答:1

我正在运行下面的代码,有意引发JsonReaderException。它正确地给出了异常消息“无法将字符串转换为布尔值:aaa。路径'Active',第3行,位置17。”

是否有任何方法可以直接从JsonReaderException获取未通过验证的值,所以我不必解析异常消息?

string json = @"{
  'Email': '[email protected]',
  'Active': 'aaa',
  'CreatedDate': '2013-01-20T00:00:00Z',
  'Roles': [
    'User',
    'Admin'
  ]
}";

try
{
  Account account = JsonConvert.DeserializeObject<Account>(json);
  Console.WriteLine(account.Email);
}
catch (JsonReaderException exc)
{
  // Do Something
}
asp.net-core json.net asp.net-core-2.0
1个回答
2
投票

[似乎冒犯的值未保存为JsonReaderException中的属性。该值的唯一可能位置是JsonReaderException字典,但是Json.NET不在此处添加任何内容。

但是,通过某些工作,您可以利用Json.NET的Exception.Data功能在引发异常时直接访问不良值。首先,定义以下辅助方法和Exception.Data子类型:

serialization error event handling

现在您可以在引发异常时访问ErrorEventArgs的值:

ErrorEventArgs

注意:

  • 由于必须手动创建自己的public class ErrorAndValueEventArgs : Newtonsoft.Json.Serialization.ErrorEventArgs { public object ReaderValue { get; } = null; public ErrorAndValueEventArgs(object readerValue, object currentObject, ErrorContext errorContext) : base(currentObject, errorContext) { this.ReaderValue = readerValue; } } public static partial class JsonExtensions { public static TRootObject Deserialize<TRootObject>(string json, EventHandler<ErrorAndValueEventArgs> error, JsonSerializerSettings settings = null) { using (var sr = new StringReader(json)) using (var jsonReader = new JsonTextReader(sr)) { var serializer = JsonSerializer.CreateDefault(settings); serializer.Error += (o, e) => error(o, new ErrorAndValueEventArgs(jsonReader.Value, e.CurrentObject, e.ErrorContext)); return serializer.Deserialize<TRootObject>(jsonReader); } } } ,因此您需要访问JSON字符串(或JsonReader.Value),此方法才能起作用。 (在您的问题中显示的示例中确实如此。)

  • JsonReader.Value中显示了一种用于捕获其他错误信息的类似技术。

  • 您可能想增强object errorValue = null; try { Account account = JsonExtensions.Deserialize<Account>(json, (o, e) => errorValue = e.ReaderValue); Console.WriteLine(account.Email); } catch (JsonException exc) { // Do Something Console.WriteLine("Value at time of {0} = {1}, Data.Count = {2}.", exc.GetType().Name, errorValue, exc.Data.Count); // Prints Value at time of JsonReaderException = aaa, Data.Count = 0. } 来同时记录JsonTextReader。如果在抛出异常时将读取器置于容器(对象或数组)的开头,则Stream将为null。

演示小提琴JsonSerializationException Parsing

© www.soinside.com 2019 - 2024. All rights reserved.