如何在System.Text.Json中运行时为第三方BaseClass添加JsonDerivedType(无特性)
解决第三方基类的Json多态序列化配置问题
当基类来自第三方库无法添加JsonDerivedType特性时,可以通过运行时配置JsonTypeInfo的方式实现多态序列化/反序列化,具体操作如下:
- 创建自定义
JsonSerializerOptions实例,指定类型解析器 - 为目标基类
BaseClass添加多态配置,绑定派生类型与对应的鉴别器 - 使用配置完成的选项执行序列化、反序列化操作
修改你的Form1_Load方法代码如下:
private void Form1_Load(object sender, EventArgs e) { // 初始化Json序列化配置选项 var options = new JsonSerializerOptions(); var typeResolver = new DefaultJsonTypeInfoResolver(); // 动态添加基类的多态配置 typeResolver.Modifiers.Add(typeInfo => { if (typeInfo.Type == typeof(BaseClass)) { typeInfo.PolymorphismOptions = new JsonPolymorphismOptions { TypeDiscriminatorPropertyName = "$type", // 可自定义鉴别器字段名,非必填 IgnoreUnrecognizedTypeDiscriminators = true, // 可选,忽略未匹配的鉴别器避免报错 DerivedTypes = { new JsonDerivedType(typeof(BaseClass), "1"), new JsonDerivedType(typeof(TestClass<int>), "2") } }; } }); options.TypeInfoResolver = typeResolver; // 使用配置好的选项执行序列化 var jsonStr = JsonSerializer.Serialize<BaseClass>(new TestClass<int>() { Name = "123", Value = "456", Tag = 1 }, options); // 执行反序列化 var deserializedObj = JsonSerializer.Deserialize<BaseClass>(jsonStr, options); }
核心说明
DefaultJsonTypeInfoResolver是System.Text.Json默认的类型信息解析器,通过Modifiers集合可以在运行时动态修改任意类型的序列化规则JsonPolymorphismOptions用于配置多态序列化行为,包括鉴别器字段名称、派生类型映射关系等- 配置的
typeDiscriminator值需在序列化和反序列化时保持一致,确保能正确识别对应派生类型
内容的提问来源于stack exchange,提问作者Volfogg
相关产品推荐
相关产品推荐

