ホームページ > バックエンド開発 > C++ > System.Text.Json で列挙値のカスタム名を指定する方法

System.Text.Json で列挙値のカスタム名を指定する方法

DDD
リリース: 2025-01-14 10:37:43
オリジナル
322 人が閲覧しました

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

System.Text.Json: 列挙値のカスタム名を指定するにはどうすればよいですか?

この機能は、 .NET Core 3.0、.NET 5、.NET 6.0、.NET 7.0、または .NET のボックス8.0。したがって、属性で指定されたカスタム値名で列挙型をシリアル化する独自の JsonConverterFactory を作成するか、同じことを行う Macross.Json.Extensions などの NuGet パッケージを使用する必要があります。 .NET 7 以降、または以前のバージョンではカスタム名の列挙型をシリアル化するだけで逆シリアル化は必要ない場合、カスタム名は、 [EnumMember(Value = "xxx")] を任意の列挙値に適用して、列挙ごとにカスタマイズされた JsonNamingPolicy を構築することで、JsonStringEnumConverter を適応させる JsonConverterFactory。

関連する手順は次のとおりです。

    カスタムを作成するコンバータ:
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);
}
ログイン後にコピー
    列挙型を装飾します:
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);
ログイン後にコピー
    コンバータを ASP.NET Core に登録します:
  1. これに対する回答を参照してくださいやり方についてのガイダンスを求めて Mani Gandham からの質問this.

注:

.NET 6 以前では、JsonStringEnumConverter は逆シリアル化中にその名前付けポリシーを無視します。この問題はプル リクエスト 73348 で修正されました。
  • .Net Core 3.x では、コンバータが [Flags] 列挙型で期待通りに動作しない可能性があります。この問題は、.NET 5 の問題 #31622 で修正されました。
  • .NET 6 以前でカスタム値名を持つ列挙型をラウンドトリップする必要がある場合は、汎用コンバーター コンバーター ファクトリを作成する必要があります。 Scratch.
  • 別の解決策は、Macross.Json.Extensions パッケージの JsonStringEnumMemberConverter を使用することです。パッケージをインストールし、属性 [JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumMemberConverter))] で列挙型を装飾します。
  • この説明がお役に立てば幸いです。他にご質問がございましたら、お知らせください。

以上がSystem.Text.Json で列挙値のカスタム名を指定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート