在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() 或正确消费 tokenWrite:用 Utf8JsonWriter 写入 "yes" 或 "no"reader.TokenType(如 String),避免解析非预期类型时报错转换器不会自动生效,必须显式添加:
JsonSerializerOptions 实例options.Converters.Add(new YesNoBoolConverter()) 注册JsonSerializer.Serialize(obj, options)
Program.cs 里用 services.AddControllers().AddJsonOptions(...))若要为自定义类(如 Person)控制序列化逻辑:
JsonConverter,在 Read 中手动读字段:reader.ReadPropertyName() + reader.GetString() 等JsonSerializer.Deserialize(ref reader, options) 复用默认行为处理子属性(避免重复造轮子)Write 中先 writer.WriteStartObject(),再逐个写字段,最后 WriteEndObject()
reader.TokenType == JsonTokenType.Null 时应返回 null 或 throw不想全局注册?可以按类型或属性粒度启用:
[JsonConverter(typeof(PersonConverter))],整个类都走该转换器[JsonConverter(typeof(DateFormatConverter))],仅该字段生效[JsonConverter(typeof(NullableConverter))]
基本上就这些。关键不是写得多,而是读得准、写得稳、null 判断到位。System.Text.Json 的 converter 没有“上下文”对象,所有逻辑都靠 Utf8JsonReader/Writer 手动推进,习惯后反而更可控。