System.Text.Json: Wie spezifiziere ich einen benutzerdefinierten Namen für einen Enumerationswert?
Diese Funktion ist außerhalb des nicht verfügbar Box in .NET Core 3.0, .NET 5, .NET 6.0, .NET 7.0 oder .NET 8.0. Daher müssen Sie Ihre eigene JsonConverterFactory erstellen, die Aufzählungen mit benutzerdefinierten Wertnamen serialisiert, die durch Attribute angegeben werden, oder ein NuGet-Paket verwenden, das dasselbe tut, z. B. Macross.Json.Extensions.
Wenn Sie in arbeiten .NET 7 oder höher verwenden oder in früheren Versionen nur Aufzählungen mit benutzerdefinierten Namen serialisieren, aber nicht deserialisieren müssen, können benutzerdefinierte Namen einfach durch Erstellen einer unterstützt werden JsonConverterFactory, die JsonStringEnumConverter anpasst, indem sie eine angepasste JsonNamingPolicy für jede Aufzählung erstellt, wobei [EnumMember(Value = "xxx")] auf jeden Aufzählungswert angewendet wird.
Hier sind die Schritte:
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);
Siehe die Antwort hierauf Frage von Mani Gandham um Anleitung dazu Dies.
Hinweise:
Ich hoffe, diese Erklärung hilft! Lassen Sie mich wissen, wenn Sie weitere Fragen haben.
Das obige ist der detaillierte Inhalt vonWie lege ich benutzerdefinierte Namen für Enum-Werte in System.Text.Json fest?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!