Web API中自定义Json反序列化转换器未触发、断点不命中问题
问题根因与解决方案
1. 转换器未适配可空DateTime类型(核心原因)
你当前自定义MultiFormatDateConverter的CanConvert方法仅匹配非可空的DateTime类型,但业务类KipReport中的所有日期属性均为DateTime?可空类型,导致转换器无法被触发,Newtonsoft.Json会走默认日期解析逻辑,自然报格式错误。
修正CanConvert方法逻辑即可:
public override bool CanConvert(Type objectType) { // 同时兼容DateTime和DateTime?可空类型 return objectType == typeof(DateTime) || Nullable.GetUnderlyingType(objectType) == typeof(DateTime); }
2. 注意异常类型一致性
你当前在转换器中抛出的是System.Text.Json.JsonException,但你使用的是Newtonsoft.Json的序列化体系,建议统一改为抛出Newtonsoft的异常,避免后续异常捕获逻辑出错:
// 替换原异常抛出逻辑 throw new Newtonsoft.Json.JsonException($"Unable to parse \"{dateString}\" as a date.");
3. 字段映射校验
你提供的JSON示例中日期字段名为LastEdtDate(拼写缺少字母i),但业务类中属性名为LastEditDate,如果没有配置字段映射或忽略大小写,该字段会反序列化失败,建议修正JSON字段名或给属性加[JsonProperty("LastEdtDate")]特性匹配。
关于Task.Run的说明
Task.Run异步执行逻辑本身不会影响自定义转换器的生效,只要你在手动调用JsonConvert.DeserializeObject时显式传入了你构造的JsonSerializerSettings对象,不管是否在异步委托中执行,配置都会正常生效。如果你之前依赖ASP.NET Core的全局Newtonsoft配置,注意全局配置仅对控制器自动反序列化请求体的场景生效,手动调用反序列化必须显式传入配置对象。
内容的提问来源于stack exchange,提问作者Sandeep Thomas
相关产品推荐
相关产品推荐

