如何基于switch实现自定义JsonStringEnumConverter及解决注册不生效问题
问题原因及修复方案
1. 序列化框架不匹配
你在AddJsonOptions中配置的是ASP.NET Core默认的System.Text.Json序列化规则,如果项目全局/控制器/单个Action标注了[NewtonsoftJson]注解,或是在Startup中调用过AddNewtonsoftJson()方法,序列化逻辑会走Newtonsoft.Json的流程,自然不会触发你基于System.Text.Json.Serialization.JsonConverter实现的自定义转换器。
修复方案:
- 若要继续使用System.Text.Json,移除所有全局/局部的Newtonsoft.Json配置项
- 若要保留Newtonsoft.Json,重新实现继承自
Newtonsoft.Json.JsonConverter的转换器,再通过以下代码注册:services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.Converters.Add(new FolderTypeConverter()); });
2. 转换器优先级低于其他枚举配置
如果FolderTypeEnum本身标注了[JsonConverter]特性,或是你注册了全局通用枚举转换器(比如默认的JsonStringEnumConverter),它们的优先级会高于你在AddJsonOptions中后注册的自定义转换器。
修复方案:
- 移除
FolderTypeEnum上已标注的[JsonConverter]特性- 调整转换器注册顺序,把自定义特定枚举转换器放在最前面,示例:
services.AddControllers() .AddJsonOptions(options => { // 先注册自定义的FolderTypeEnum转换器 options.JsonSerializerOptions.Converters.Add(new FolderTypeConverter()); // 再注册其他通用枚举转换器(如果需要保留) options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); // 原有配置 options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; });
3. 配置仅作用于Controller模式不覆盖Minimal API
如果你使用的是ASP.NET Core Minimal API,AddJsonOptions的配置默认仅对Controller模式的API生效,不会作用于Minimal API的序列化流程。
修复方案:
单独配置Minimal API的序列化规则:builder.Services.Configure<JsonOptions>(options => { options.SerializerOptions.Converters.Add(new FolderTypeConverter()); options.SerializerOptions.PropertyNameCaseInsensitive = true; options.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; });
4. 未适配可空枚举类型
如果你的接口入参/出参中使用的是FolderTypeEnum?可空枚举类型,你实现的JsonConverter<FolderTypeEnum>默认只会匹配非空枚举类型,不会触发可空类型的转换逻辑。
修复方案:
重写转换器的CanConvert方法,使其支持可空枚举的判断:public override bool CanConvert(Type typeToConvert) { return typeToConvert == typeof(FolderTypeEnum) || Nullable.GetUnderlyingType(typeToConvert) == typeof(FolderTypeEnum); }
内容的提问来源于stack exchange,提问作者Jason Landbridge
相关产品推荐
相关产品推荐

