Maison >développement back-end >C++ >Comment spécifier des noms personnalisés pour les valeurs Enum dans System.Text.Json ?
System.Text.Json : Comment spécifier un nom personnalisé pour une valeur d'énumération ?
Cette fonctionnalité n'est pas disponible hors de dans .NET Core 3.0, .NET 5, .NET 6.0, .NET 7.0 ou .NET 8.0. Par conséquent, vous devrez créer votre propre JsonConverterFactory qui sérialise les énumérations avec des noms de valeurs personnalisés spécifiés par les attributs, ou utiliser un package NuGet qui fait de même, tel que Macross.Json.Extensions.
Si vous travaillez dans .NET 7 ou version ultérieure, ou il suffit de sérialiser mais pas de désérialiser les énumérations avec des noms personnalisés dans les versions antérieures, les noms personnalisés peuvent être facilement pris en charge en créant un JsonConverterFactory qui adapte JsonStringEnumConverter en construisant un JsonNamingPolicy personnalisé pour chaque énumération avec [EnumMember(Value = "xxx")] appliqué à n'importe quelle valeur d'énumération.
Voici les étapes impliquées :
public class JsonEnumMemberStringEnumConverter : JsonConverterFactory { public JsonEnumMemberStringEnumConverter() : this(null, true) { } public JsonEnumMemberStringEnumConverter(JsonNamingPolicy? namingPolicy = null, bool allowIntegerValues = true) { this.namingPolicy = namingPolicy; this.allowIntegerValues = allowIntegerValues; this.baseConverter = new JsonStringEnumConverter(namingPolicy, allowIntegerValues); } 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); } } public class JsonNamingPolicyDecorator : JsonNamingPolicy { readonly JsonNamingPolicy? underlyingNamingPolicy; public JsonNamingPolicyDecorator(JsonNamingPolicy? underlyingNamingPolicy) => this.underlyingNamingPolicy = underlyingNamingPolicy; public override string ConvertName(string name) => underlyingNamingPolicy?.ConvertName(name) ?? name; } internal class DictionaryLookupNamingPolicy : JsonNamingPolicyDecorator { readonly Dictionary<string, string> dictionary; public DictionaryLookupNamingPolicy(Dictionary<string, string> dictionary, JsonNamingPolicy? underlyingNamingPolicy) : base(underlyingNamingPolicy) => this.dictionary = dictionary ?? throw new ArgumentNullException(); public override string ConvertName(string name) => dictionary.TryGetValue(name, out var value) ? value : base.ConvertName(name); }
public enum Example { Trick, Treat, [EnumMember(Value = "Trick-Or-Treat")] TrickOrTreat, }
var options = new JsonSerializerOptions { Converters = { new JsonEnumMemberStringEnumConverter() }, // Set other options as required: WriteIndented = true, }; var json = JsonSerializer.Serialize(values, options);
Reportez-vous à la réponse à cette question question de Mani Gandham pour obtenir des conseils sur la façon de procéder ceci.
Remarques :
J'espère que cette explication vous aidera ! Faites-moi savoir si vous avez d'autres questions.
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!