看起来
JsonStringEnumConverter
需要动态代码,我们应该在AOT中切换到JsonStringEnumConverter<T>
。
[JsonConverter(typeof(JsonStringEnumConverter<MyEnum>))]
public enum MyEnum { Foo, Bar }
[JsonSerializable(typeof(MyEnum))]
public partial class MyJsonSerializerContext : JsonSerializerContext { }
我有很多枚举。是否可以创建一个全局策略,以便将每个枚举转换为其字符串表示形式,并且我们避免使用属性?
如如何在 System.Text.Json 中使用源生成:一揽子策略中所述,您可以将
[JsonSourceGenerationOptions(UseStringEnumConverter = true)]
应用于序列化上下文,以强制将所有枚举序列化为字符串:
您可以使用 JsonSourceGenerationOptionsAttribute
应用一揽子策略将枚举序列化为字符串,而不是使用JsonStringEnumConverter<TEnum>
类型。创建一个 JsonSerializerContext 类并使用 JsonSerializedAttribute 和 JsonSourceGenerationOptionsAttribute 属性对其进行注释
因此您应该按如下方式修改您的
MyJsonSerializerContext
:
[JsonSourceGenerationOptions(UseStringEnumConverter = true)]
[JsonSerializable(typeof(MyEnum))]
public partial class MyJsonSerializerContext : JsonSerializerContext { }
但请注意,如 issue #92828 中所示,从 .NET 8 开始,似乎没有一种方法可以使用此方法配置命名策略,例如
JsonNamingPolicy.CamelCase
。因此,设置 UseStringEnumConverter = true
缺乏与 new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
相同的功能。 (问题中显示的代码不使用枚举序列化的命名策略。)