.NET AOT中如何全局配置枚举使用JsonStringEnumConverter字符串转换
.NET AOT下全局配置枚举JSON字符串序列化策略
在.NET AOT场景中,常规JsonStringEnumConverter因依赖动态代码生成无法使用,必须改用泛型版本JsonStringEnumConverter<T>。如果枚举数量多,逐个添加JsonConverter特性过于繁琐,可通过以下两种全局策略实现自动转换:
方案一:通过JsonSerializerContext全局注册转换器
直接在自定义的JsonSerializerContext构造函数中配置全局转换器,所有声明在JsonSerializable特性中的枚举都会自动应用字符串序列化:
[JsonSerializable(typeof(MyEnum1))] [JsonSerializable(typeof(MyEnum2))] // 按需添加所有需要序列化的枚举类型 public partial class MyJsonSerializerContext : JsonSerializerContext { public MyJsonSerializerContext() : base(new JsonSerializerOptions { Converters = { new JsonStringEnumConverter() } }) { } }
方案二:自定义转换器工厂自动处理所有枚举
如果不想手动维护JsonSerializable中的枚举列表(仍需确保枚举被AOT序列化代码覆盖),可编写转换器工厂自动识别枚举类型并应用对应泛型转换器:
1. 实现转换器工厂
public class JsonStringEnumConverterFactory : JsonConverterFactory { public override bool CanConvert(Type typeToConvert) { return typeToConvert.IsEnum; } public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options) { var converterType = typeof(JsonStringEnumConverter<>).MakeGenericType(type); return (JsonConverter)Activator.CreateInstance(converterType); } }
2. 在JsonSerializerContext中注册工厂
[JsonSerializable(typeof(MyEnum1))] [JsonSerializable(typeof(MyEnum2))] // 所有需要序列化的枚举仍需在此声明 public partial class MyJsonSerializerContext : JsonSerializerContext { public MyJsonSerializerContext() : base(new JsonSerializerOptions { Converters = { new JsonStringEnumConverterFactory() } }) { } }
注意事项
- 无论哪种方案,所有需要序列化的枚举必须添加到
JsonSerializable特性中,这是.NET AOT提前生成序列化代码的硬性要求。 - 方案二中的
Activator.CreateInstance仅用于创建已知枚举类型的转换器实例,不会触发动态代码生成,符合AOT环境限制。
内容的提问来源于stack exchange,提问作者user246392
相关产品推荐
相关产品推荐

