如何為 System.Text.Json 中的枚舉值指定自訂名稱?

System.Text.Json:如何為枚舉值指定自訂名稱?
此功能不可用.NET Core 3.0、.NET 5、.NET 6.0、.NET 7.0 或 .NET 中的框8.0。因此,您需要建立自己的 JsonConverterFactory 來序列化具有屬性指定的自訂值名稱的枚舉,或使用具有相同功能的 NuGet 包,例如 Macross.Json.Extensions。
如果您正在使用.NET 7或更高版本,或者早期版本中只需要序列化而不需要反序列化具有自訂名稱的枚舉,可以透過建立JsonConverterFactory 透過為每個枚舉建構自訂的JsonNamingPolicy 來適應JsonStringEnumConverter,並將[EnumMember(Value = "xxx")] 套用於任何枚舉值。
以下是涉及的步驟:
- 建立自訂轉換器:
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 && 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,
}
- 使用轉換器Standalone:
var options = new JsonSerializerOptions
{
Converters = { new JsonEnumMemberStringEnumConverter() },
// Set other options as required:
WriteIndented = true,
};
var json = JsonSerializer.Serialize(values, options);
- 使用ASP.NET Core 註冊轉換器:
參考此答案Mani Gandham 提出問題,尋求如何做的指導
註釋:
- 註釋:
- 註釋:
以上是如何為 System.Text.Json 中的枚舉值指定自訂名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!
熱AI工具
Undress AI Tool
免費脫衣圖片
Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片
AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。
Clothoff.io
AI脫衣器
Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!
熱門文章
熱工具
記事本++7.3.1
好用且免費的程式碼編輯器
SublimeText3漢化版
中文版,非常好用
禪工作室 13.0.1
強大的PHP整合開發環境
Dreamweaver CS6
視覺化網頁開發工具
SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
c認識python的人的教程
Jul 01, 2025 am 01:11 AM
學Python的人轉學C 最直接的困惑是:為什麼不能像Python那樣寫?因為C 雖然語法更複雜,但提供了底層控制能力和性能優勢。 1.語法結構上,C 使用花括號{}而非縮進組織代碼塊,且變量類型必須顯式聲明;2.類型系統與內存管理方面,C 沒有自動垃圾回收機制,需手動管理內存並註意釋放資源,使用RAII技術可輔助資源管理;3.函數與類定義中,C 需要明確訪問修飾符、構造函數和析構函數,並支持如運算符重載等高級功能;4.標準庫方面,STL提供了強大的容器和算法,但需要適應泛型編程思想;5
C中的多態性:綜合指南
Jun 21, 2025 am 12:11 AM
C 中的多態性分為運行時多態性和編譯時多態性。 1.運行時多態性通過虛函數實現,允許在運行時動態調用正確的方法。 2.編譯時多態性通過函數重載和模板實現,提供更高的性能和靈活性。
C驅動器:實用的代碼示例
Jun 22, 2025 am 12:16 AM
c destructorSarespecialememberfunctionsthatautapityReleSoursoursoursoursoursoursoursOutgoesOutofScopeOrisdelet.1)shemarecrucialformanagingmemory,filehandles,andNetworkConnections.2)初學者
c帶有OpenGL的圖形編程教程
Jul 02, 2025 am 12:07 AM
作為C 程序員入門圖形編程,OpenGL是一個好的選擇。首先需搭建開發環境,使用GLFW或SDL創建窗口,配合GLEW或glad加載函數指針,並正確設置上下文版本如3.3 。其次理解OpenGL的狀態機模型,掌握繪製核心流程:創建編譯著色器、鏈接程序、上傳頂點數據(VBO)、配置屬性指針(VAO)並調用繪製函數。此外要熟悉調試技巧,檢查著色器編譯與程序鏈接狀態,啟用頂點屬性數組,設置清屏顏色等。推薦學習資源包括LearnOpenGL、OpenGLRedBook及YouTube教程系列。掌握上述
c標準模板庫(STL)的教程
Jul 02, 2025 am 01:26 AM
STL(標準模板庫)是C 標準庫的重要組成部分,包含容器、迭代器和算法三大核心組件。 1.容器如vector、map、set用於存儲數據;2.迭代器用於訪問容器元素;3.算法如sort、find用於操作數據。選擇容器時,vector適合動態數組,list適合頻繁插入刪除,deque支持雙端快速操作,map/unordered_map用於鍵值對查找,set/unordered_set用於去重。使用算法時應包含頭文件,並配合迭代器和lambda表達式。注意避免失效迭代器、刪除時更新迭代器、不可修改m
C競爭性編程教程
Jul 02, 2025 am 12:54 AM
學C 衝著打比賽應從以下幾點入手:1.熟練基礎語法但不必深入,掌握變量定義、循環、條件判斷、函數等基本內容;2.重點掌握STL容器如vector、map、set、queue、stack的使用;3.學會快速輸入輸出技巧,如關閉同步流或使用scanf和printf;4.利用模板與宏簡化代碼書寫,提高效率;5.多刷題熟悉邊界條件、初始化錯誤等常見細節問題。
C中的標準模板庫(STL)是什麼?
Jul 01, 2025 am 01:17 AM
C STL是一組通用模板類和函數,包含容器、算法、迭代器等核心組件。容器如vector、list、map、set用於存儲數據,vector支持隨機訪問,適合頻繁讀取;list插入刪除高效但訪問慢;map和set基於紅黑樹,自動排序適用於快速查找。算法如sort、find、copy、transform、accumulate封裝常用操作,作用於容器的迭代器範圍。迭代器作為連接容器與算法的橋樑,支持遍歷和訪問元素。其他組件包括函數對象、適配器、分配器,用於定制邏輯、改變行為及內存管理。 STL簡化了C
在C中使用std :: Chrono
Jul 15, 2025 am 01:30 AM
std::chrono在C 中用於處理時間,包括獲取當前時間、測量執行時間、操作時間點與持續時間及格式化解析時間。 1.獲取當前時間使用std::chrono::system_clock::now(),可轉換為可讀字符串但係統時鐘可能不單調;2.測量執行時間應使用std::chrono::steady_clock以確保單調性,並通過duration_cast轉換為毫秒、秒等單位;3.時間點(time_point)和持續時間(duration)可相互操作,但需注意單位兼容性和時鐘紀元(epoch)


