我正在尝试处理反序列化错误,但是即使我能够访问错误处理功能并将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情况,只是跳过它。
答案 0 :(得分:1)
不是答案,而是一种解决方法:将错误处理移至序列化器选项:
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的评论:
当从Entity类本身引发异常更改时,在实体类中具有OnError很有用,如此处{@ {3}}
中对PersonError类的Roles属性所述。
答案 1 :(得分:1)
最后我找到了解决方案。 为了处理这种情况,我不得不创建Json Converter。
public class JMSDateTimeConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
try
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Object && GetAllChildresnCount(token) == 2)
{
return token.ToObject(objectType);
}
else
{
return null;
}
}
catch (Exception ex)
{
return null;
}
finally
{
}
}
private int GetAllChildresnCount(JToken token)
{
var container = token as JContainer;
if (container == null)
{
return 0;
}
var count = container.Count;
foreach (JToken subToken in container)
{
count += GetAllChildresnCount(subToken);
}
return count;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}
现在工作正常。