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

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

c#怎么自定义json转换器 system.text.json自定义converter教程

System.Text.Json 中自定义 JSON 转换器,核心是继承 JsonConverter 并重写 ReadWrite 方法。它比 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)控制序列化逻辑:

Artifact News

Artifact News

由AI驱动的个性化新闻推送

下载

  • 继承 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 手动推进,习惯后反而更可控。

https://www.php.cn/faq/2031008.html

发表回复

Your email address will not be published. Required fields are marked *