在自訂 System.Text.Json JsonConverter 中實作預設序列化
當實作自訂 System.Text.Json.JsonConverter<T>
來升級資料模型時,可能需要重寫 Write()
方法。但是,在某些情況下,您可能想要保留預設的序列化行為。為了實現這一點,您可以利用以下策略。
1. 應用於屬性的 JsonConverter
如果自訂轉換器套用於屬性,則在 Write()
方法中簡單地呼叫 JsonSerializer.Serialize(writer, person, options);
將產生預設序列化。
2. 加入 Converters 集合的轉換器
在這種情況下,您可以透過以下方式修改 Write()
方法中的 Converters
集合:
<code class="language-csharp">public override void Write(Utf8JsonWriter writer, Person person, JsonSerializerOptions options) { // 复制传入的选项并移除自定义转换器。 var modifiedOptions = options.CopyAndRemoveConverter(typeof(PersonConverter)); JsonSerializer.Serialize(writer, person, modifiedOptions); }</code>
3. 應用於自訂值類型或 POCO 的 JsonConverter
目前沒有內建方法可以為此場景產生預設序列化。
4. 由 JsonConverterFactory 傳回的轉換器
要停用在轉換器清單中使用轉換器工廠,請考慮建立一個 JsonConverterFactory
,該工廠傳回一個在應用工廠時跳過序列化的自訂轉換器。
改進的實現
在提供的範例中,改進的實作使用 DefaultConverterFactory<T>
。此類別可讓您方便地在製造的轉換器中快取複製的選項。完整的實作如下:
<code class="language-csharp">public sealed class PersonConverter : DefaultConverterFactory<Person> { // ... 原问题的现有代码 ... } public abstract class DefaultConverterFactory<T> : JsonConverterFactory { // ... 接受的答案中的现有代码 ... } public static class JsonSerializerExtensions { // ... 接受的答案中的现有代码 ... }</code>
其他說明
DefaultConverterFactory
將自訂轉換器套用至自訂值類型或 POCO 可能會導致堆疊溢位。 以上是使用自訂 System.Text.Json JsonConverter 時如何保留預設序列化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!