.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
相关产品推荐
相关产品推荐

