Maison > développement back-end > C++ > Comment personnaliser les valeurs Enum dans System.Text.Json ?

Comment personnaliser les valeurs Enum dans System.Text.Json ?

Barbara Streisand
Libérer: 2025-01-14 08:36:44
original
545 Les gens l'ont consulté

How to Customize Enum Values in System.Text.Json?

Personnaliser les valeurs d'énumération dans System.Text.Json

Difficulté : Spécifier des valeurs personnalisées pour les valeurs d'énumération

Dans .NET 5 et versions ultérieures, nous ne pouvons pas utiliser directement JsonPropertyName pour spécifier des valeurs personnalisées pour les valeurs d'énumération comme nous le pouvons avec des propriétés normales. Cette fonctionnalité n’est pas disponible directement.

Méthode 1 : Personnaliser JsonConverterFactory (recommandée)

Pour résoudre ce problème, nous avons introduit une usine JsonConverter (JsonEnumMemberStringEnumConverter) qui exploite JsonStringEnumConverter et l'avons adaptée pour utiliser un [EnumMember(Value="xxx")] personnalisé pour chaque type d'énumération annoté avec JsonNamingPolicy. Par exemple :

<code class="language-csharp">[EnumMember(Value = "Trick-Or-Treat")] // 自定义值
public enum Example { Trick, Treat, TrickOrTreat }</code>
Copier après la connexion

Enregistrement et utilisation du convertisseur personnalisé :

<code class="language-csharp">var options = new JsonSerializerOptions
{
    Converters = { new JsonEnumMemberStringEnumConverter() },
    // ...
};
var json = JsonSerializer.Serialize(values, options);</code>
Copier après la connexion

Ce convertisseur présente les avantages suivants :

  • Traitement aller-retour transparent des énumérations avec des valeurs personnalisées.
  • Conserver les valeurs personnalisées lors de la désérialisation.
  • gère les énumérations avec la même valeur, cohérente avec JsonStringEnumConverter.
  • Prend en charge les types d'énumération mutables et immuables.

Méthode 2 : Package Macross.Json.Extensions

Alternativement, nous pouvons utiliser le package Macross.Json.Extensions, qui fournit un JsonStringEnumMemberConverter qui après l'installation nous permet d'annoter l'énumération comme suit :

<code class="language-csharp">[JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumMemberConverter))]
public enum Example { Trick, Treat, [EnumMember(Value="Trick-Or-Treat")] TrickOrTreat }</code>
Copier après la connexion

Troisième méthode : usine de conversion générique avec remplacements personnalisés (avancé)

Si vous avez besoin d'un contrôle plus précis ou si vous devez prendre en charge les énumérations avec des valeurs personnalisées dans les versions de .NET antérieures à 6.0, vous pouvez créer une usine de convertisseurs génériques et un convertisseur à partir de zéro. Cette approche est plus complexe et peut nécessiter un rétroportage pour les versions antérieures.

Remarques

  • Les types d'énumération avec des attributs [Flags] peuvent nécessiter un JsonConverter modifié. Consultez les instructions dans la réponse pour plus de détails sur la gestion de cette situation.
  • Dans les versions .NET antérieures à 6.0, JsonStringEnumConverter ignorerait son JsonNamingPolicy lors de la désérialisation. Ce problème a été résolu dans la pull request 73348.
  • Si votre énumération possède à la fois les attributs [EnumMember] et [JsonPropertyName], la valeur de [EnumMember] dans le convertisseur personnalisé sera prioritaire.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal