首页 > 解决方案 > 处理 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 场景,而只是跳过它。

标签: c#json.net

解决方案


不是答案,而是解决方法:将错误处理移至序列化程序选项:

    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


推荐阅读