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 && 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); } }
附加說明:
以上是如何在 System.Text.Json 中自訂枚舉值名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!