You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:57:05