C#怎么自定义JSON转换器 System.Text.Json自定义Converter教程

来源:这里教程网 时间:2026-02-21 17:39:47 作者:

System.Text.Json
中自定义 JSON 转换器,核心是继承
JsonConverter<t></t>
并重写
Read
Write
方法。它比 Newtonsoft.Json 更轻量、更安全,但灵活性略低——所以明确类型、处理好 null 和边界情况特别重要。

创建基础自定义转换器

比如你想把字符串 "yes"/"no" 映射为

bool
,而默认解析不支持:

新建类继承
JsonConverter<bool></bool>
重写
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<person></person>
,在
Read
中手动读字段:
reader.ReadPropertyName()
+
reader.GetString()
JsonSerializer.Deserialize<t>(ref reader, options)</t>
复用默认行为处理子属性(避免重复造轮子)
Write
中先
writer.WriteStartObject()
,再逐个写字段,最后
WriteEndObject()
注意 null 值处理:
reader.TokenType == JsonTokenType.Null
时应返回 null 或 throw

使用特性 [JsonConverter] 快速绑定

不想全局注册?可以按类型或属性粒度启用:

加在类上:
[JsonConverter(typeof(PersonConverter))]
,整个类都走该转换器
加在属性上:
[JsonConverter(typeof(DateFormatConverter))]
,仅该字段生效
支持泛型转换器,例如
[JsonConverter(typeof(NullableConverter<datetime>))]</datetime>
特性方式优先级高于全局注册的转换器

基本上就这些。关键不是写得多,而是读得准、写得稳、null 判断到位。System.Text.Json 的 converter 没有“上下文”对象,所有逻辑都靠

Utf8JsonReader/Writer
手动推进,习惯后反而更可控。

相关推荐