Maison >développement back-end >C++ >Comment personnaliser les noms de valeurs Enum dans System.Text.Json ?

Comment personnaliser les noms de valeurs Enum dans System.Text.Json ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-14 06:55:44312parcourir

How to Customize Enum Value Names in System.Text.Json?

System.Text.Json : noms de valeurs d'énumération personnalisés

System.Text.Json ne fournit pas de moyen intégré pour spécifier des valeurs pour les membres enum. Cependant, il existe plusieurs options pour y parvenir :

Utilisation d'une JsonConverterFactory personnalisée :

Créez une classe de convertisseur personnalisée qui hérite de JsonConverterFactory et implémente les méthodes CanConvert et CreateConverter. Dans CanConvert, vérifiez si le type à convertir est une énumération. Dans CreateConverter, créez une instance JsonEnumConverter personnalisée qui gère les valeurs personnalisées.

Utilisation d'une bibliothèque tierce :

Les bibliothèques comme Macross.Json.Extensions fournissent des convertisseurs qui prennent en charge noms de valeurs d'énumération personnalisés. Installez la bibliothèque et décorez votre énumération avec [JsonConverter(typeof(JsonStringEnumMemberConverter))].

Création d'un convertisseur personnalisé et d'une usine dans .NET 6 ou version antérieure :

Dans .NET 6 ou version antérieure, un convertisseur personnalisé et une fabrique de convertisseurs sont nécessaires pour les énumérations aller-retour avec des noms personnalisés. Cela implique la gestion de l'analyse des valeurs entières et des chaînes, le renommage des composants d'énumération [Flags] et la conversion des énumérations de tous les types sous-jacents possibles.

Utilisation d'un convertisseur d'énumération générique :

Un convertisseur d'énumération générique peut être créé pour gérer à la fois les énumérations [Flags] et non-[Flags], avec un remplacement personnalisé pour la conversion de nom si nécessaire. Ceci est plus complexe que l'utilisation d'un convertisseur spécifique pour chaque type.

Exemple de code utilisant une usine de convertisseurs personnalisés :

public class JsonEnumMemberStringEnumConverter : JsonConverterFactory
{
    public override bool CanConvert(Type typeToConvert) => baseConverter.CanConvert(typeToConvert);
    public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
    {
        var query = from field in typeToConvert.GetFields(BindingFlags.Public | BindingFlags.Static)
                    let attr = field.GetCustomAttribute<EnumMemberAttribute>()
                    where attr != null &amp;&amp; attr.Value != null
                    select (field.Name, attr.Value);
        var dictionary = query.ToDictionary(p => p.Item1, p => p.Item2);
        if (dictionary.Count > 0)
            return new JsonStringEnumConverter(new DictionaryLookupNamingPolicy(dictionary, namingPolicy), allowIntegerValues).CreateConverter(typeToConvert, options);
        else
            return baseConverter.CreateConverter(typeToConvert, options);
    }
}

Remarques supplémentaires :

  • Dans .NET 6 et versions antérieures, JsonStringEnumConverter ignore sa politique de dénomination lors désérialisation. Ce problème a été corrigé dans .NET 7.
  • Dans .NET Core 3.x, le convertisseur personnalisé peut ne pas fonctionner comme souhaité avec les énumérations [Flags] où les valeurs individuelles sont renommées.
  • Dans .NET 5, ce problème est résolu.
  • Pour .NET 6 ou version antérieure, une approche d'usine de convertisseur générique peut être nécessaire.
  • Les bibliothèques tierces comme Macross.Json.Extensions simplifient le processus.

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