如何让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
相关产品推荐
相关产品推荐

