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

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

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

我有很多enum.有没有可能创建一个全局策略,以便每个枚举都转换为它的字符串表示,并且避免使用属性?

推荐答案

How to use source generation in System.Text.Json: Blanket policy中所述,您可以将[JsonSourceGenerationOptions(UseStringEnumConverter = true)]应用于序列化上下文,以强制所有枚举序列化为字符串:

您可以应用一揽子策略,通过使用JsonSourceGenerationOptionsAttribute将枚举序列化为字符串,而不是使用JsonStringEnumConverter<TEnum>类型.创建一个JsonSerializerContext类并使用JsonSerializableAttribute and 101属性对其进行注释

因此,你应该按如下方式修改你的MyJsonSerializerContext:

[JsonSourceGenerationOptions(UseStringEnumConverter = true)]
[JsonSerializable(typeof(MyEnum))]
public partial class MyJsonSerializerContext : JsonSerializerContext { }

问题中显示的代码不使用naming policy(例如JsonNamingPolicy.CamelCase)进行枚举序列化.如果您需要一个,请注意,如issue #92828as of .NET 8中所示,似乎没有办法使用此方法配置一个.即设置UseStringEnumConverter = true缺少与new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)的特征对等.MSFT的Eirik Tsarpalis建议的解决方法是将所需的转换器应用于序列化上下文,而不是每个枚举:

public class CamelCaseEnumConverter<TEnum>() : 
    JsonStringEnumConverter<TEnum>(JsonNamingPolicy.CamelCase) where TEnum : struct, Enum;

[JsonSourceGenerationOptions(
    Converters = new[] { 
        // Add all known enums here
        typeof(CamelCaseEnumConverter<MyEnum>)}),
// Add all known enums here also (which you were already doing):
 JsonSerializable(typeof(MyEnum))]
public partial class MyJsonSerializerContext : JsonSerializerContext { }

更多信息请参见:100.

Csharp相关问答推荐

在实际上是List T的 IESEARCH上多次调用First()是否不好?

为什么我在PuppeteerSharp中运行StealthPlugin时会出现错误?

使用变量子根名称在C#中重新初始化SON文件

Regex在c#中完全匹配

. NET 8使用COM向VB6公开

如何在Visual Studio代码中更改大括号模式{},用于C#语言

如何注册接口类型,类型<>

XUNIT是否使用测试数据的源生成器?

发布用于Linux Ubuntu的C#应用程序

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

在允许溢出的情况下将小数转换为长

.NET SDK包中的官方C#编译器在哪里?

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

CA1508:';NULL=>;TRUE;始终为';TRUE';.移除或重构条件(S)以避免死代码

依赖项注入、工厂方法和处置困境

如何使用用于VS代码的.NET Maui扩展在我的iOS/Android设备或模拟器上进行调试?

如何将%{v_扩展}转换为%{v_扩展}>>

正在try 将自定义字体添加到我的控制台应用程序

如何在.NET MAUI上在iOS和Mac之间共享代码?(no条件编译和无代码重复)

部署Aspnet Blazor服务器时出现未处理的Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]异常