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

.NET 7中System.Text.Json多级多态序列化的[JsonDerivedType]配置位置

解决System.Text.Json多级多态序列化异常的问题

你遇到的异常是因为System.Text.Json的多态类型注册规则与DataContractSerializer不同:所有直接或间接的派生类型(包括“孙类”)必须直接在最顶层的基类上通过[JsonDerivedType]声明,而不能像[KnownType]那样分散在中间派生类上。

修正后的类型配置代码

// 所有派生类型(包括孙类)都直接注册在顶层基类上
[JsonDerivedType(typeof(DerivedType), "DerivedType:#MyNamespace")]
[JsonDerivedType(typeof(DerivedOfDerivedType), "DerivedOfDerivedType:#MyNamespace")]
public abstract class BaseType { } // Properties omitted

public class DerivedType : BaseType { public string DerivedValue { get; set; } } 

public class DerivedOfDerivedType : DerivedType { public string DerivedOfDerivedValue { get; set; } }

原因说明

当序列化List<BaseType>时,System.Text.Json只会读取BaseType上的多态配置,中间类DerivedType上的[JsonDerivedType]不会被纳入基类的多态解析逻辑。因此必须把所有最终需要序列化的派生类型(包括深层的DerivedOfDerivedType)直接注册在顶层基类上,这样序列化器才能识别这些类型并正确处理。

验证结果

修正后执行你的序列化代码,会生成包含类型标识的JSON:

[
  {
    "$type": "DerivedOfDerivedType:#MyNamespace",
    "DerivedValue": "value 1",
    "DerivedOfDerivedValue": "value of DerivedOfDerived"
  }
]

额外说明

如果不想在基类上集中注册所有派生类型,也可以通过JsonSerializerOptions的TypeInfoResolver手动配置多态规则,但属性方式下必须遵循“顶层基类注册所有派生类型”的规则。

内容的提问来源于stack exchange,提问作者dbc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:40:18