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

.NET 8中System.Text.Json多态反序列化失效问题求助

问题根源

你的代码中,System.Text.Json无法识别派生类的核心原因是多态判别器的属性名匹配问题:

  • 基类通过[JsonPolymorphic(TypeDiscriminatorPropertyName = nameof(Type))]指定判别器属性名为Type(大写开头),但JSON中的字段是小写的type。
  • 在.NET 6及更早版本中,PropertyNameCaseInsensitive = true的配置不会作用于多态判别器的属性名匹配,导致框架无法找到判别器信息,只能默认反序列化为基类BaseType。

解决方案

方案1:指定属性与JSON字段的映射(推荐,兼容所有.NET版本)

在BaseType的Type属性上添加[JsonPropertyName("type")]特性,明确绑定JSON中的小写字段:

public class BaseType
{
    [JsonPropertyName("type")] // 新增:映射到JSON的小写字段
    [JsonConverter(typeof(JsonStringEnumConverter))]
    required public BlockType Type { get; set; }
}

修改后,框架会正确识别JSON中的type字段作为判别器,自动反序列化为对应的Type1或Type2实例。

方案2:修改JSON的判别器字段名

将JSON中的"type"改为和基类属性名一致的"Type":

{
  "ListOfItems": [
    {
      "Type": "T1",
      "Value1": 10
    },
    {
      "Type": "T2",
      "Value2": 11
    }
  ]
}

方案3:升级到.NET 7及以上版本

在.NET 7+中,PropertyNameCaseInsensitive = true的配置会覆盖多态判别器的属性名大小写检查,无需修改代码或JSON,原逻辑即可正常工作。


验证

修改后重新执行反序列化代码,Container.ListOfItems中的项会分别是Type1和Type2的实例,此时强制转换不会抛出InvalidCastException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:56:06