【发布时间】:2018-10-12 09:43:26
【问题描述】:
我正在尝试处理反序列化错误,但即使我能够访问错误处理函数并将 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 场景,而只是跳过它。
【问题讨论】:
-
看看newtonsoft.com/json/help/html/SerializationErrorHandling.htm,了解如何正确使用
OnError。 -
@ChetanRanpariya - 我在该问题中找不到与您链接的文档不同的任何内容。你能帮忙吗?
-
在文档中写道:“在此示例中,当未设置任何角色时,访问 Roles 属性将引发异常。HandleError 方法将在将角色序列化为已处理并允许 Json.NET 时设置错误继续序列化课程。”因此,如果我很好地理解了将 Handled 设置为 true 之后,应该进一步反序列化。还是我错了?
-
我的建议是使用第一种方法,将 OnError 用作
JsonSerializerSettings的一部分,而不是在实体类本身中使用OnError。当实体类本身抛出异常变化时,在实体类中使用OnError很有用,正如我共享的链接中PersonError类的Roles属性所解释的那样。对于 OP 的这个问题,NewtonSoft 库会引发异常...应该通过将OnError作为JsonSerializerSettings的一部分来处理。 -
试图重现用例。 dotnetfiddle.net/HEh4qT 类内部的 OnError 中处理的错误和 JSON 序列化错误中处理的错误是不同的。因此,即使在类内部处理了一个错误,库也会抛出另一个错误..