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

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

Barbara Streisand
發布: 2025-01-14 08:36:44
原創
609 人瀏覽過

How to Customize Enum Values in System.Text.Json?

在System.Text.Json自訂枚舉值

難題:指定枚舉值的自訂值

在.NET 5及更高版本中,我們不能像處理普通屬性那樣直接使用JsonPropertyName指定枚舉值的自訂值。此功能並非開箱即用。

方法一:自訂JsonConverterFactory(推薦)

為了解決這個問題,我們引入了一個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套件

或者,我們可以使用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。有關處理此類情況的更多詳細信息,請參閱回應中的說明。
  • 在6.0之前的.NET版本中,JsonStringEnumConverter在反序列化期間會忽略其JsonNamingPolicy,這個問題在拉取請求73348中已修復。
  • 如果您的枚舉同時具有[EnumMember][JsonPropertyName]屬性,則自訂轉換器中[EnumMember]的值將優先。

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板