我正在运行下面的代码,有意引发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
}
[似乎冒犯的值未保存为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。