Maison >développement back-end >C++ >Comment personnaliser les noms de valeurs Enum dans 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 && 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 :
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!