如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 #92828、as 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.