[英]newtonsoft json deserialization error handling: partial deserialization
[英]Handling Error in NewtonSoft Deserialization doesn't work
我正在嘗試處理反序列化錯誤,但是即使我能夠訪問錯誤處理功能並將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的評論:
當從Entity類本身引發異常更改時,在Entity類中具有OnError很有用,如此處有關PersonError類的Roles屬性所述: https ://www.newtonsoft.com/json/help/html/SerializationErrorHandling .htm
終於我找到了解決方案。 為了處理這種情況,我不得不創建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);
}
}
現在工作正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.