在System.Text.Json中自定义转换器需继承JsonConverter并重写Read/Write方法,注册到JsonSerializerOptions或用[JsonConverter]特性绑定,注意类型判断、null处理及token手动推进。

在 System.Text.Json 中自定义 JSON 转换器,核心是继承 JsonConverter 并重写 Read 和 Write 方法。它比 Newtonsoft.Json 更轻量、更安全,但灵活性略低——所以明确类型、处理好 null 和边界情况特别重要。
创建基础自定义转换器
比如你想把字符串 "yes"/"no" 映射为 bool,而默认解析不支持:
- 新建类继承
JsonConverter - 重写
Read:从ref Utf8JsonReader读取 token,判断值并返回 bool;注意调用reader.Skip()或正确消费 token - 重写
Write:用Utf8JsonWriter写入 "yes" 或 "no" - 务必检查
reader.TokenType(如String),避免解析非预期类型时报错
注册转换器到 JsonSerializerOptions
转换器不会自动生效,必须显式添加:
- 创建
JsonSerializerOptions实例 - 用
options.Converters.Add(new YesNoBoolConverter())注册 - 序列化/反序列化时传入该 options:
JsonSerializer.Serialize(obj, options) - 也可全局配置(如 ASP.NET Core 中在
Program.cs里用services.AddControllers().AddJsonOptions(...))
处理复杂类型(如泛型或嵌套对象)
若要为自定义类(如 Person)控制序列化逻辑:
- 继承
JsonConverter,在Read中手动读字段:reader.ReadPropertyName()+reader.GetString()等 - 用
JsonSerializer.Deserialize复用默认行为处理子属性(避免重复造轮子)(ref reader, options) -
Write中先writer.WriteStartObject(),再逐个写字段,最后WriteEndObject() - 注意 null 值处理:
reader.TokenType == JsonTokenType.Null时应返回 null 或 throw
使用特性 [JsonConverter] 快速绑定
不想全局注册?可以按类型或属性粒度启用:
- 加在类上:
[JsonConverter(typeof(PersonConverter))],整个类都走该转换器 - 加在属性上:
[JsonConverter(typeof(DateFormatConverter))],仅该字段生效 - 支持泛型转换器,例如
[JsonConverter(typeof(NullableConverter))] - 特性方式优先级高于全局注册的转换器
基本上就这些。关键不是写得多,而是读得准、写得稳、null 判断到位。System.Text.Json 的 converter 没有“上下文”对象,所有逻辑都靠 Utf8JsonReader/Writer 手动推进,习惯后反而更可控。










