ホームページ >バックエンド開発 >C++ >System.Text.Json でカスタム列挙値名を使用する方法

System.Text.Json でカスタム列挙値名を使用する方法

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-14 07:54:45930ブラウズ

How to Use Custom Enum Value Names with System.Text.Json?

System.Text.Json でカスタム列挙値名を使用する

JsonConverter クラスを使用して、列挙値のカスタム名を指定できます。その方法は次のとおりです:

  1. カスタムコンバーターを定義します:
<code class="language-csharp">public class CustomEnumStringEnumConverter : JsonConverter<Enum>
{
    protected override Enum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 从JSON文本解析枚举名称
        var name = reader.GetString();

        // 获取枚举类型
        var enumType = typeToConvert;

        // 按名称查找枚举值
        Enum value;
        if (!Enum.TryParse(enumType, name, true, out value))
        {
            throw new JsonException("无效的枚举值: " + name);
        }

        return value;
    }

    protected override void Write(Utf8JsonWriter writer, Enum value, JsonSerializerOptions options)
    {
        // 获取枚举值的自定义名称
        var customName = GetCustomName(value);

        // 将自定义名称写入JSON文本
        writer.WriteStringValue(customName);
    }

    private string GetCustomName(Enum value)
    {
        // 获取枚举值的字段信息
        var fieldInfo = enumType.GetField(value.ToString());

        // 获取应用于该字段的自定义属性
        var attribute = fieldInfo.GetCustomAttribute<EnumMemberAttribute>();

        // 返回属性中的自定义名称,如果未指定则返回默认名称
        return attribute?.Value ?? value.ToString();
    }
}</code>
  1. JsonSerializerOptions を使用してコンバータを登録します:
<code class="language-csharp">var options = new JsonSerializerOptions
{
    Converters = { new CustomEnumStringEnumConverter() }
};</code>
  1. EnumMember 属性を適用します:

EnumMember 属性を使用して列挙値を装飾し、カスタム名を指定します:

<code class="language-csharp">public enum Example
{
    [EnumMember(Value = "Trick-Or-Treat")]
    TrickOrTreat,
    // 其他枚举值
}</code>
  1. シリアル化と逆シリアル化:

カスタム JsonConverter を使用して列挙型をシリアル化および逆シリアル化できるようになりました:

<code class="language-csharp">// 序列化枚举值
var json = JsonSerializer.Serialize(value, options);

// 反序列化枚举值
var value = JsonSerializer.Deserialize<Enum>(json, options);</code>

手順:

  • この方法には .NET Core 3.1 以降が必要です。
  • 複数の列挙型にカスタム コンバータを使用する必要がある場合は、汎用コンバータを作成できます。
  • このメソッドを使用すると、シリアル化および逆シリアル化中に列挙値をラウンドトリップする機能を維持しながら、列挙値のカスタム名を指定できます。

以上がSystem.Text.Json でカスタム列挙値名を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。