在.NET 5及更高版本中,我们不能像处理普通属性那样直接使用JsonPropertyName
指定枚举值的自定义值。此功能并非开箱即用。
为了解决这个问题,我们引入了一个JsonConverter工厂(JsonEnumMemberStringEnumConverter
),它利用JsonStringEnumConverter
,并将其改编为对每个用[EnumMember(Value="xxx")]
注释的枚举类型使用自定义JsonNamingPolicy
。例如:
<code class="language-csharp">[EnumMember(Value = "Trick-Or-Treat")] // 自定义值 public enum Example { Trick, Treat, TrickOrTreat }</code>
自定义转换器注册和用法:
<code class="language-csharp">var options = new JsonSerializerOptions { Converters = { new JsonEnumMemberStringEnumConverter() }, // ... }; var json = JsonSerializer.Serialize(values, options);</code>
此转换器具有以下优点:
JsonStringEnumConverter
一致。或者,我们可以使用Macross.Json.Extensions
包,它提供了一个JsonStringEnumMemberConverter
,安装后允许我们如下注释枚举:
<code class="language-csharp">[JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumMemberConverter))] public enum Example { Trick, Treat, [EnumMember(Value="Trick-Or-Treat")] TrickOrTreat }</code>
如果您需要更精细的控制,或者需要在早于6.0版本的.NET中支持具有自定义值的枚举,您可以从头创建一个泛型转换器工厂和转换器。这种方法比较复杂,可能需要为早期版本进行回溯移植。
[Flags]
属性的枚举类型可能需要修改后的JsonConverter
。有关处理此类情况的更多详细信息,请参阅响应中的说明。JsonStringEnumConverter
在反序列化期间会忽略其JsonNamingPolicy
,这个问题在拉取请求73348中已修复。[EnumMember]
和[JsonPropertyName]
属性,则自定义转换器中[EnumMember]
的值将优先。以上是如何在 System.Text.Json 中自定义枚举值?的详细内容。更多信息请关注PHP中文网其他相关文章!