c# - 处理 NewtonSoft 反序列化中的错误不起作用
问题描述
我正在尝试处理反序列化错误,但即使我能够访问错误处理函数并将 Handled 属性设置为 true ,也会将错误抛出给主函数。
楷模:
public class PriceValidity
{
public Date EndDate { get; set; }
public Date StartDate { get; set; }
[OnError]
internal void OnError(StreamingContext context, ErrorContext errorContext)
{
errorContext.Handled = true;
}
}
public class Date
{
[JsonProperty("$date")]
public DateTime Value { get; set; }
}
调用反序列化器:
private void ParseMessage<T>(string message) where T: new()
{
var result = new T();
var jsonSerializer = new Newtonsoft.Json.JsonSerializer();
using (var reader = new StringReader(message))
using (var jsonReader = new JsonTextReader(reader))
{
result = jsonSerializer.Deserialize<T>(jsonReader);
};
}
JSON:
{
"StartDate":{
"$date":"2018-05-07T00:00:00.000Z"
},
"EndDate":{
"$date":{
"$numberLong":"253402214400000"
}
}
}
错误:
解析值后遇到意外字符::. 路径 'EndDate.$date',
我也不想处理 $numberLong 场景,而只是跳过它。
解决方案
不是答案,而是解决方法:将错误处理移至序列化程序选项:
private T ParseMessage<T>(string message) where T : new() =>
JsonConvert.DeserializeObject<T>(message, new JsonSerializerSettings
{
Error = (object sender, ErrorEventArgs args) => { args.ErrorContext.Handled = true; }
});
来自 Chetan Ranpariya 的评论:
当实体类本身抛出异常变化时,在实体类中设置 OnError 很有用,如此处对 PersonError 类的 Roles 属性的解释:https ://www.newtonsoft.com/json/help/html/SerializationErrorHandling .htm
推荐阅读
- javascript - 如何使用对象数组访问 if?
- php - mysql查询:获取多表选择相关表的最后一行
- excel - 检查天数是否在日期范围内 Excel
- postgresql - go-gorm postgres dialect: managing structs for jsonb insert and find to properly use json tags
- excel - 如何在 Excel 中使用 VLOOKUP 修复 N/A 错误
- javascript - 即使使用插件也无法让 babel 转换传播运算符
- amazon-web-services - 使用 CloudFormation 模板创建的 S3 存储桶是否有“请求者付费”属性?
- amazon-web-services - 调整 AWS ECS Spot 请求
- javascript - 如何平滑地拉伸和收缩旋转线弧?
- django - 项目中使用的 Django Alter 命令行过滤器