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

如何让System.Text.Json自定义枚举转换器兼容集合类型?

在.NET 7的System.Text.Json中处理枚举集合的EnumMember序列化问题

.NET 7的System.Text.Json没有官方配置项可以直接让单个枚举转换器自动适配集合类型——它的转换器绑定机制要求严格匹配目标类型,这和Newtonsoft.Json的集合自动适配逻辑不同。不过你可以通过官方推荐的扩展方式解决这个问题,不用为每种集合编写单独的转换器:

方案一:实现JsonConverterFactory统一处理枚举及枚举集合

通过自定义JsonConverterFactory,可以自动识别单个枚举类型或任意枚举集合类型,并为其生成对应的转换器实例。结合你已实现的单个枚举转换器,只需要新增工厂类即可:

1. 编写转换器工厂

public class EnumMemberConverterFactory : JsonConverterFactory
{
    public override bool CanConvert(Type typeToConvert)
    {
        // 匹配单个枚举,或枚举的List/HashSet/IEnumerable等集合类型
        return typeToConvert.IsEnum 
               || (typeToConvert.IsGenericType 
                   && (typeToConvert.GetGenericTypeDefinition() == typeof(List<>) 
                       || typeToConvert.GetGenericTypeDefinition() == typeof(HashSet<>)
                       || typeToConvert.GetGenericTypeDefinition() == typeof(IEnumerable<>))
                   && typeToConvert.GetGenericArguments()[0].IsEnum);
    }

    public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
    {
        Type enumType = typeToConvert.IsEnum ? typeToConvert : typeToConvert.GetGenericArguments()[0];
        
        // 复用你已实现的JsonStringEnumConverter<TEnum>
        var converterType = typeof(JsonStringEnumConverter<>).MakeGenericType(enumType);
        return (JsonConverter)Activator.CreateInstance(converterType);
    }
}

2. 注册工厂到序列化配置

var jsonOptions = new JsonSerializerOptions();
// 替换成你之前的单个枚举转换器对应的工厂
jsonOptions.Converters.Add(new EnumMemberConverterFactory());

这样不管是单个枚举属性,还是List<YourEnum>、HashSet<YourEnum>等集合类型,都会自动使用你自定义的枚举转换器读取[EnumMember]的Value值,无需额外编写集合转换器。

方案二:使用内置JsonStringEnumConverter(若满足需求)

如果你的自定义逻辑只是读取[EnumMember]的Value,其实可以直接用System.Text.Json内置的JsonStringEnumConverter,通过配置启用UseEnumMemberNames选项:

var jsonOptions = new JsonSerializerOptions();
jsonOptions.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
{
    Options = JsonStringEnumConverterOptions.UseEnumMemberNames
});

不过同样,要让它自动处理集合,还是需要配合上面的JsonConverterFactory来包装(内置转换器本身不支持自动适配集合)。


内容的提问来源于stack exchange,提问作者Whit Waldo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:45:28