在.NET 5及更高版本中,我們不能像處理普通屬性那樣直接使用JsonPropertyName
指定枚舉值的自訂值。此功能並非開箱即用。
為了解決這個問題,我們引入了一個JsonConverter工廠(JsonEnumMemberStringEnumConverter
),它利用JsonStringEnumConverter
,並將其改編為對每個用[EnumMember(Value="xxx")]
註釋的枚舉類型使用自定義JsonNamingPolicy
。例如:
[EnumMember(Value = "Trick-Or-Treat")] // 自定义值 public enum Example { Trick, Treat, TrickOrTreat }
自訂轉換器註冊與用法:
var options = new JsonSerializerOptions { Converters = { new JsonEnumMemberStringEnumConverter() }, // ... }; var json = JsonSerializer.Serialize(values, options);
此轉換器具有以下優點:
JsonStringEnumConverter
一致。 或者,我們可以使用Macross.Json.Extensions
包,它提供了一個JsonStringEnumMemberConverter
,安裝後允許我們如下註釋枚舉:
[JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumMemberConverter))] public enum Example { Trick, Treat, [EnumMember(Value="Trick-Or-Treat")] TrickOrTreat }
如果您需要更精細的控制,或者需要在早於6.0版本的.NET中支援具有自訂值的枚舉,您可以從頭開始建立一個泛型轉換器工廠和轉換器。這種方法比較複雜,可能需要為早期版本進行回溯移植。
[Flags]
屬性的枚舉類型可能需要修改後的JsonConverter
。有關處理此類情況的更多詳細信息,請參閱回應中的說明。 JsonStringEnumConverter
在反序列化期間會忽略其JsonNamingPolicy
,這個問題在拉取請求73348中已修復。 [EnumMember]
和[JsonPropertyName]
屬性,則自訂轉換器中[EnumMember]
的值將優先。 以上是如何在 System.Text.Json 中自訂枚舉值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!