首頁 > 後端開發 > C++ > 如何在自訂 JsonConverters 中保留預設 JSON 序列化行為?

如何在自訂 JsonConverters 中保留預設 JSON 序列化行為?

Linda Hamilton
發布: 2025-01-10 09:08:42
原創
471 人瀏覽過

How Can I Preserve Default JSON Serialization Behavior in Custom JsonConverters?

自訂 JsonConverter 中的預設序列化覆蓋

問題

如何在自訂 System.Text.Json.JsonConverter 中保留預設的序列化行為,而無需自訂寫入邏輯?

說明

JsonConverter 的選擇有不同的優先級,包括:

  • 屬性等級的特性
  • 加入 Converters 集合中的轉換器
  • 應用於自訂值類型或 POCO 的特性
  • 轉換器工廠回傳的轉換器

解決方法

根據轉換器應用方法的不同,有不同的方法可以實現預設序列化:

屬性等級特性

呼叫 JsonSerializer.Serialize(writer, person, options); 將產生預設序列化。

Converters 集合中的轉換器

  • 複製傳入的選項,從副本的 Converters 清單中刪除轉換器。
  • 將修改後的選項傳遞到 JsonSerializer.Serialize(Utf8JsonWriter, T, JsonSerializerOptions);
  • 注意:此方法可能不是執行緒安全的,並可能導致遞歸類型出現問題。

自訂值類型或 POCO

  • 目前,不支援為應用於自訂值類型或 POCO 的轉換器產生預設序列化。

轉換器工廠

  • 使用 DefaultConverterFactory 建立一個產生預設序列化的轉換器。
  • 在製造的轉換器中快取不包含轉換器的修改後的選項。

範例

這是一個使用轉換器工廠的範例:

<code class="language-csharp">public sealed class PersonConverter : DefaultConverterFactory<Person>
{
    ...

    protected override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions modifiedOptions)
        => (T)JsonSerializer.Deserialize(ref reader, typeToConvert, modifiedOptions);

    protected override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions modifiedOptions) 
        => JsonSerializer.Serialize(writer, value, modifiedOptions);
}

...

var person = new Person("John", "Doe");
var options = new JsonSerializerOptions { Converters = { new PersonConverter() } };
var json = JsonSerializer.Serialize(person, options);</code>
登入後複製

重要說明

  • 直接將 DefaultConverterFactory 套用於自訂值類型或 POCO 將導致堆疊溢位。
  • 當將轉換器套用至屬性層級特性時,使用 JsonSerializer.Serialize(writer, person, options); 將產生預設序列化。

以上是如何在自訂 JsonConverters 中保留預設 JSON 序列化行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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