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.
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>
Enregistrement et utilisation du convertisseur personnalisé :
<code class="language-csharp">var options = new JsonSerializerOptions { Converters = { new JsonEnumMemberStringEnumConverter() }, // ... }; var json = JsonSerializer.Serialize(values, options);</code>
Ce convertisseur présente les avantages suivants :
JsonStringEnumConverter
. 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>
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.
[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. JsonStringEnumConverter
ignorerait son JsonNamingPolicy
lors de la désérialisation. Ce problème a été résolu dans la pull request 73348. [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!