Heim > Backend-Entwicklung > C++ > Wie kann ich Enum-Wertnamen in System.Text.Json anpassen?

Wie kann ich Enum-Wertnamen in System.Text.Json anpassen?

Patricia Arquette
Freigeben: 2025-01-14 06:55:44
Original
313 Leute haben es durchsucht

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

System.Text.Json: Benutzerdefinierte Enum-Wertnamen

System.Text.Json bietet keine integrierte Möglichkeit zur Angabe benutzerdefinierter Werte Werte für Enum-Mitglieder. Es gibt jedoch mehrere Möglichkeiten, dies zu erreichen:

Verwenden einer benutzerdefinierten JsonConverterFactory:

Erstellen Sie eine benutzerdefinierte Konverterklasse, die von JsonConverterFactory erbt und die Methoden CanConvert und CreateConverter implementiert. Überprüfen Sie in CanConvert, ob der zu konvertierende Typ eine Aufzählung ist. Erstellen Sie in CreateConverter eine benutzerdefinierte JsonEnumConverter-Instanz, die die benutzerdefinierten Werte verarbeitet.

Verwendung einer Bibliothek eines Drittanbieters:

Bibliotheken wie Macross.Json.Extensions bieten Konverter, die dies unterstützen benutzerdefinierte Enum-Wertnamen. Installieren Sie die Bibliothek und dekorieren Sie Ihre Enumeration mit [JsonConverter(typeof(JsonStringEnumMemberConverter))].

Erstellen eines benutzerdefinierten Konverters und einer benutzerdefinierten Factory in .NET 6 oder früher:

In .NET 6 oder früher, ein benutzerdefinierter Konverter und eine Konverter-Factory sind für das Roundtripping von Enumerationen mit benutzerdefinierten Namen erforderlich. Dies umfasst das Parsen von Ganzzahl- und Zeichenfolgenwerten, das Umbenennen von [Flags]-Enumerationskomponenten und das Konvertieren von Enumerationen aller möglichen zugrunde liegenden Typen.

Verwendung eines generischen Enum-Konverters:

Ein generischer Enum-Konverter kann erstellt werden, um sowohl [Flags]- als auch Nicht-[Flags]-Enums zu verarbeiten, mit benutzerdefinierter Überschreibung für den Namen Konvertierung bei Bedarf. Dies ist aufwändiger als die Verwendung eines spezifischen Konverters für jeden Typ.

Codebeispiel mit einer benutzerdefinierten Konverterfabrik:

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);
    }
}
Nach dem Login kopieren

Zusätzliche Hinweise:

  • In .NET 6 und früher ignoriert JsonStringEnumConverter seine Benennungsrichtlinie während Deserialisierung. Dies wurde in .NET 7 behoben.
  • In .NET Core 3.x funktioniert der benutzerdefinierte Konverter möglicherweise nicht wie gewünscht mit [Flags]-Aufzählungen, bei denen einzelne Werte umbenannt werden.
  • In .NET 5 ist dieses Problem behoben.
  • Für .NET 6 oder früher ist möglicherweise ein generischer Konverter-Converter-Factory-Ansatz möglich notwendig.
  • Bibliotheken von Drittanbietern wie Macross.Json.Extensions vereinfachen den Prozess.

Das obige ist der detaillierte Inhalt vonWie kann ich Enum-Wertnamen in System.Text.Json anpassen?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage