.NET 6.0中单个字段的Custom JsonConverter特性失效问题
解决.NET 6中Newtonsoft Json特性转换器不生效的问题
问题根源
迁移到.NET 6后[JsonConverter]特性失效,大概率是混淆了Newtonsoft.Json与System.Text.Json的命名空间,或是全局配置中的冗余设置导致特性被忽略。
具体解决方案
1. 确保特性引用正确的命名空间
因为你已配置使用Newtonsoft.Json作为序列化工具,必须保证实体类中的[JsonConverter]特性来自Newtonsoft.Json命名空间,而非默认的System.Text.Json.Serialization:
using Newtonsoft.Json; using Newtonsoft.Json.Converters; public class CustomDateConverter : IsoDateTimeConverter { public CustomDateConverter() { DateTimeFormat = "dd.MM.yyyy"; } } public class Test { // 必须是Newtonsoft.Json下的JsonConverter特性 [JsonConverter(typeof(CustomDateConverter))] public DateTime? CustomFormattedDate { get; set; } }
2. 简化全局配置,消除潜在冲突
你的配置中显式设置了DefaultContractResolver,但Newtonsoft.Json默认就使用该解析器,冗余设置可能引发冲突。尝试注释掉这一行:
builder.Services.AddControllersWithViews() .AddNewtonsoftJson(options => { options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 注释此行,避免不必要的配置冲突 // options.SerializerSettings.ContractResolver = new DefaultContractResolver(); });
3. 检查手动序列化场景
如果控制器Action中手动使用System.Text.Json.JsonSerializer序列化对象,会绕过Newtonsoft的配置,此时需改用Newtonsoft的序列化方法:
// 错误写法(使用System.Text.Json) var json = JsonSerializer.Serialize(testObj); // 正确写法(使用Newtonsoft.Json) var json = JsonConvert.SerializeObject(testObj);
验证步骤
启动项目后,访问返回Test对象的接口,查看CustomFormattedDate字段是否按dd.MM.yyyy格式输出。若仍不生效,可尝试删除项目的bin/obj目录清理缓存后重新构建。
内容的提问来源于stack exchange,提问作者rabusmar
相关产品推荐
相关产品推荐

