首頁 >後端開發 >C++ >如何在 System.Text.Json 中自訂枚舉值名稱?

如何在 System.Text.Json 中自訂枚舉值名稱?

Patricia Arquette
Patricia Arquette原創
2025-01-14 06:55:44349瀏覽

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

System.Text.Json:自訂枚舉值名稱

System.Text.Json 不提供內建方法來指定自訂舉成員的值。但是,有多種選擇可以實現此目的:

使用自訂JsonConverterFactory:

建立一個繼承自JsonConverterFactory 的自訂轉換器類別並實作CanConvert 和CreateConverter方法。在CanConvert中,檢查要轉換的類型是否為枚舉。在 CreateConverter 中,建立一個處理自訂值的自訂 JsonEnumConverter 實例。

使用第三方函式庫:

Macross.Json.Extensions 等函式庫提供支援的轉換器自訂枚舉值名稱。安裝程式庫並使用 [JsonConverter(typeof(JsonStringEnumMemberConverter))] 裝飾您的枚舉。

在.NET 6 或更早版本中建立自訂轉換器和工廠:

中在.NET 6 或更早版本中,具有自訂名稱的往返枚舉需要自訂轉換器和轉換器工廠。這涉及處理整數和字串值的解析、[Flags] 枚舉組件的重命名以及轉換所有可能的基礎類型的枚舉。

使用通用枚舉轉換器:

可以建立通用枚舉轉換器來處理[Flags] 和非[Flags] 枚舉,並在以下情況下使用自訂覆蓋進行名稱轉換需要。這比為每種類型使用特定轉換器更複雜。

使用自訂轉換器工廠的程式碼範例:

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);
    }
}

附加說明:

  • 附加說明:
  • 附加說明:
  • 附加說明:
附加說明:附加說明:附加說明:在.NET 6 及更早版本中,JsonStringEnumConverter 忽略反序列化期間的命名策略。此問題已在 .NET 7 中修復。 在 .NET Core 3.x 中,自訂轉換器可能無法依照需要重新命名單一值的 [Flags] 枚舉工作。 在 .NET 中5,此問題已修復。 對於 .NET 6 或更早版本,通用轉換器轉換器工廠方法可能是必要的。 像 Macross.Json.Extensions 這樣的第三方函式庫簡化了這個過程。

以上是如何在 System.Text.Json 中自訂枚舉值名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn