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