首页 >后端开发 >C++ >如何在自定义 JsonConverters 中保留默认 JSON 序列化行为?

如何在自定义 JsonConverters 中保留默认 JSON 序列化行为?

Linda Hamilton
Linda Hamilton原创
2025-01-10 09:08:42470浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn