如何自定义System.Text.Json对特定字段的序列化与反序列化逻辑?
如何自定义System.Text.Json对特定字段的序列化与反序列化逻辑?
这个场景太有共鸣了!第三方API返回的对象没法直接序列化,我们又只需要存它的ID来完成后续还原,用System.Text.Json的**自定义转换器(JsonConverter)**就能完美解决,我给你一步步拆解实现方式:
核心思路
我们要为I3rdPartyObject类型写一个专属的转换器,明确告诉序列化器:
- 序列化时:跳过整个第三方对象,只提取它的ID写入JSON
- 反序列化时:从JSON里读出ID,调用你的
DataManager.GetDataById()方法把ID还原成真实的I3rdPartyObject实例
具体实现步骤
1. 编写自定义转换器类
创建一个继承自JsonConverter<I3rdPartyObject>的类,重写序列化和反序列化的核心逻辑:
using System.Text.Json; using System.Text.Json.Serialization; public class I3rdPartyObjectConverter : JsonConverter<I3rdPartyObject> { // 序列化逻辑:把第三方对象转换成ID字符串写入JSON public override void Write(Utf8JsonWriter writer, I3rdPartyObject value, JsonSerializerOptions options) { // 这里替换成第三方对象实际获取ID的方式,比如value.Id/value.GetId()等 string dataId = value.Id; writer.WriteStringValue(dataId); } // 反序列化逻辑:从JSON读取ID,再通过DataManager获取真实对象 public override I3rdPartyObject Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) { throw new JsonException("I3rdPartyObject的序列化值必须是字符串类型的ID"); } string dataId = reader.GetString(); // 调用你的DataManager获取对应实例 return DataManager.GetDataById(dataId); } }
2. 给目标字段绑定转换器
在你的MyClass里,给Data字段加上[JsonConverter]属性,指定我们刚才写的转换器:
public class MyClass { public int Id; // 标记该字段使用自定义转换器处理 [JsonConverter(typeof(I3rdPartyObjectConverter))] public I3rdPartyObject Data; }
3. 正常执行序列化/反序列化操作
现在就可以像平时一样用JsonSerializer处理MyClass对象了:
// 序列化示例 var myObj = new MyClass { Id = 1, Data = DataManager.GetDataById("abc") // 假设这是一个已存在的第三方对象实例 }; string json = JsonSerializer.Serialize(myObj); // 最终生成的JSON会是:{"Id":1,"Data":"abc"} // 反序列化示例 MyClass deserializedObj = JsonSerializer.Deserialize<MyClass>(json); // 此时deserializedObj.Data就是通过DataManager.GetDataById("abc")获取到的真实实例
额外实用提示
- 如果第三方对象没有直接暴露ID属性,你可以根据实际情况调整
Write方法的逻辑(比如通过内部字段反射、或者对象的ToString()返回ID等) - 如果你有很多地方用到
I3rdPartyObject,可以把转换器全局注册到JsonSerializerOptions里,不用每个字段都加属性:var options = new JsonSerializerOptions(); options.Converters.Add(new I3rdPartyObjectConverter()); // 使用这个配置好的options进行序列化/反序列化 string json = JsonSerializer.Serialize(myObj, options);
备注:内容来源于stack exchange,提问作者Boppity Bop
相关产品推荐
相关产品推荐

