如何为.NET AOT中的所有枚举启用JsonStringEnumConverter

问题描述 投票:0回答:1

看起来

JsonStringEnumConverter
需要动态代码,我们应该在AOT中切换到
JsonStringEnumConverter<T>

[JsonConverter(typeof(JsonStringEnumConverter<MyEnum>))]
public enum MyEnum { Foo, Bar }

[JsonSerializable(typeof(MyEnum))]
public partial class MyJsonSerializerContext : JsonSerializerContext { }

我有很多枚举。是否可以创建一个全局策略,以便将每个枚举转换为其字符串表示形式,并且我们避免使用属性?

c# enums system.text.json .net-8.0 native-aot
1个回答
0
投票

如何在 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)
相同的功能。 (问题中显示的代码不使用枚举序列化的命名策略。)

© www.soinside.com 2019 - 2024. All rights reserved.