首頁 > 後端開發 > C++ > 實作自訂 JsonConverter 時如何保留預設的 System.Text.Json 序列化行為?

實作自訂 JsonConverter 時如何保留預設的 System.Text.Json 序列化行為?

Linda Hamilton
發布: 2025-01-10 07:24:42
原創
771 人瀏覽過

How Can I Preserve Default System.Text.Json Serialization Behavior When Implementing a Custom JsonConverter?

在保持預設行為的同時自訂 System.Text.Json 序列化

問題:

在為資料模型升級實作自訂 System.Text.Json.JsonConverter 時,如何在 Write() 方法中保持預設序列化行為,同時又不影響其他序列化選項?

答案:

為了在自訂 System.Text.Json.JsonConverter 的 Write() 方法中保留預設序列化行為,您可以使用以下策略:

選項 1:在屬性上使用 [JsonConverter]

  • 將 [JsonConverter] 屬性套用至特定屬性。
  • 呼叫 JsonSerializer.Serialize() 而不提供任何自訂選項將產生預設序列化。

選項 2:修改轉換器集合

  • 在 Write() 方法內部,建立傳入選項的副本,並從 Converters 集合中移除自訂轉換器。
  • 將修改後的選項傳遞到巢狀的 JsonSerializer 呼叫中。

選項 3:實作 DefaultConverterFactory

  • 定義一個自訂轉換器工廠(例如,DefaultConverterFactory),它包裝一個預設轉換器。
  • 工廠的 CanConvert() 方法決定轉換器是否適用。
  • 工廠的 CreateConverter() 方法建立一個使用修改後的選項(不包含自訂轉換器)的轉換器。

限制:

  • 選項 3 不適用於自訂值類型或在其類型本身俱有 [JsonConverter] 屬性的 POCO。
  • 由於修改後的選項未一致應用,遞歸類型可能會導致問題。

範例:

<code class="language-csharp">public sealed class PersonConverter : DefaultConverterFactory<Person>
{
    public override Person Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions modifiedOptions)
    {
        // 自定义读取实现
    }
}

public abstract class DefaultConverterFactory<T> : JsonConverterFactory
{
    public override bool CanConvert(Type typeToConvert) => typeof(T) == typeToConvert;

    public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
    {
        return new DefaultConverter(options, this);
    }
}

public sealed class DefaultConverter : JsonConverter<Person>
{
    public override void Write(Utf8JsonWriter writer, Person value, JsonSerializerOptions modifiedOptions)
    {
        // 调用默认的 Write 实现
        JsonSerializer.Serialize(writer, value, modifiedOptions);
    }
}</code>
登入後複製

以上是實作自訂 JsonConverter 時如何保留預設的 System.Text.Json 序列化行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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