Heim > Backend-Entwicklung > C++ > Wie lege ich benutzerdefinierte Namen für Enum-Werte in System.Text.Json fest?

Wie lege ich benutzerdefinierte Namen für Enum-Werte in System.Text.Json fest?

DDD
Freigeben: 2025-01-14 10:37:43
Original
322 Leute haben es durchsucht

How to Specify Custom Names for Enum Values in System.Text.Json?

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:

  1. Erstellen Sie eine benutzerdefinierte Konverter:
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 &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);
    }
}

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);
}
Nach dem Login kopieren
  1. Dekorieren Sie Ihre Enumeration:
public enum Example
{
    Trick,
    Treat,
    [EnumMember(Value = "Trick-Or-Treat")]
    TrickOrTreat,
}
Nach dem Login kopieren
  1. Verwenden Sie die Konverter Standalone:
var options = new JsonSerializerOptions
{
    Converters = { new JsonEnumMemberStringEnumConverter() },
    // Set other options as required:
    WriteIndented = true,
};
var json = JsonSerializer.Serialize(values, options);
Nach dem Login kopieren
  1. Registrieren Sie den Konverter bei ASP.NET Core:

Siehe die Antwort hierauf Frage von Mani Gandham um Anleitung dazu Dies.

Hinweise:

  • In .NET 6 und früher ignoriert JsonStringEnumConverter seine Namensrichtlinie während der Deserialisierung; Dieses Problem wurde in Pull Request 73348 behoben.
  • In .Net Core 3.x funktioniert der Konverter möglicherweise nicht wie gewünscht mit [Flags]-Enumerationen. Dieses Problem wurde in Problem Nr. 31622 in .NET 5 behoben.
  • Wenn Sie in .NET 6 oder früher einen Roundtrip für eine Aufzählung mit benutzerdefinierten Wertnamen durchführen müssen, müssen Sie daraus eine generische Konverter-Konverter-Factory erstellen Scratch.
  • Eine alternative Lösung ist die Verwendung von JsonStringEnumMemberConverter aus dem Macross.Json.Extensions-Paket. Installieren Sie das Paket und dekorieren Sie dann Ihre Enumeration mit dem Attribut [JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumMemberConverter))].

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage