首页 > 后端开发 > C++ > 如何在 System.Text.Json 中自定义枚举值?

如何在 System.Text.Json 中自定义枚举值?

Barbara Streisand
发布: 2025-01-14 08:36:44
原创
545 人浏览过

How to Customize Enum Values in System.Text.Json?

在System.Text.Json中自定义枚举值

难题:指定枚举值的自定义值

在.NET 5及更高版本中,我们不能像处理普通属性那样直接使用JsonPropertyName指定枚举值的自定义值。此功能并非开箱即用。

方法一:自定义JsonConverterFactory(推荐)

为了解决这个问题,我们引入了一个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包

或者,我们可以使用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。有关处理此类情况的更多详细信息,请参阅响应中的说明。
  • 在6.0之前的.NET版本中,JsonStringEnumConverter在反序列化期间会忽略其JsonNamingPolicy,这个问题在拉取请求73348中已修复。
  • 如果您的枚举同时具有[EnumMember][JsonPropertyName]属性,则自定义转换器中[EnumMember]的值将优先。

以上是如何在 System.Text.Json 中自定义枚举值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板