Maison >développement back-end >C++ >Comment utiliser des noms de valeurs d'énumération personnalisés avec System.Text.Json ?

Comment utiliser des noms de valeurs d'énumération personnalisés avec System.Text.Json ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-14 07:54:45924parcourir

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

Utiliser le nom de la valeur d'énumération personnalisée dans System.Text.Json

Vous pouvez utiliser la classe JsonConverter pour spécifier des noms personnalisés pour les valeurs d'énumération. Voici comment procéder :

  1. Définir un convertisseur personnalisé :
<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. Enregistrez le convertisseur à l'aide de JsonSerializerOptions :
<code class="language-csharp">var options = new JsonSerializerOptions
{
    Converters = { new CustomEnumStringEnumConverter() }
};</code>
  1. Appliquer l'attribut EnumMember :

Utilisez l'attribut EnumMember pour décorer la valeur d'énumération afin de spécifier un nom personnalisé :

<code class="language-csharp">public enum Example
{
    [EnumMember(Value = "Trick-Or-Treat")]
    TrickOrTreat,
    // 其他枚举值
}</code>
  1. Sérialisation et désérialisation :

Vous pouvez désormais sérialiser et désérialiser les énumérations à l'aide de JsonConverter personnalisés :

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

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

Instructions :

  • Cette méthode nécessite .NET Core 3.1 ou supérieur.
  • Si vous devez utiliser un convertisseur personnalisé pour plusieurs types d'énumération, vous pouvez créer un convertisseur générique.
  • Cette méthode vous permet de spécifier un nom personnalisé pour la valeur d'énumération tout en conservant la possibilité d'effectuer un aller-retour entre la valeur d'énumération lors de la sérialisation et de la désérialisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn