You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:20:04