Heim >Backend-Entwicklung >C++ >Wie verwende ich benutzerdefinierte Enum-Wertnamen mit System.Text.Json?

Wie verwende ich benutzerdefinierte Enum-Wertnamen mit System.Text.Json?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-14 07:54:45930Durchsuche

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

Benutzerdefinierten Enumerationswertnamen in System.Text.Json verwenden

Sie können die Klasse JsonConverter verwenden, um benutzerdefinierte Namen für Aufzählungswerte anzugeben. So geht's:

  1. Definieren Sie einen benutzerdefinierten Konverter:
<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. Registrieren Sie den Konverter mit JsonSerializerOptions:
<code class="language-csharp">var options = new JsonSerializerOptions
{
    Converters = { new CustomEnumStringEnumConverter() }
};</code>
  1. Wenden Sie das EnumMember-Attribut an:

Verwenden Sie das Attribut EnumMember, um den Enumerationswert zu ergänzen und einen benutzerdefinierten Namen anzugeben:

<code class="language-csharp">public enum Example
{
    [EnumMember(Value = "Trick-Or-Treat")]
    TrickOrTreat,
    // 其他枚举值
}</code>
  1. Serialisierung und Deserialisierung:

Sie können Aufzählungen jetzt mit benutzerdefinierten JsonConverters serialisieren und deserialisieren:

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

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

Anleitung:

  • Diese Methode erfordert .NET Core 3.1 oder höher.
  • Wenn Sie einen benutzerdefinierten Konverter für mehrere Aufzählungstypen verwenden müssen, können Sie einen generischen Konverter erstellen.
  • Mit dieser Methode können Sie einen benutzerdefinierten Namen für den Aufzählungswert angeben und gleichzeitig die Möglichkeit zum Roundtrip des Aufzählungswerts während der Serialisierung und Deserialisierung beibehalten.

Das obige ist der detaillierte Inhalt vonWie verwende ich benutzerdefinierte Enum-Wertnamen mit System.Text.Json?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn