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

.NET 9中System.Text.Json未知鉴别符回退基类失效问题

问题排查与解决方案

你的问题核心原因是基类中手动声明了与多态鉴别符同名的属性,干扰了System.Text.Json的多态处理逻辑,导致UnknownDerivedTypeHandling配置失效。

具体问题点

你在RecordClass中定义了[JsonPropertyName("$type")]的RecordType属性,而这个名字正好和JsonPolymorphic特性指定的TypeDiscriminatorPropertyName一致。System.Text.Json会将这个属性当作普通业务属性处理,而非框架用于多态判断的鉴别符,因此完全忽略了你配置的UnknownDerivedTypeHandling = FallBackToBaseType规则,遇到未知鉴别符时直接抛出异常。

修复步骤

  1. 移除冲突属性:删除RecordClass中的RecordType属性及对应的JsonPropertyName特性,让框架自动处理多态鉴别符:
[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type", UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)]
[JsonDerivedType(typeof(RecordClass))]
[JsonDerivedType(typeof(RecordProfileClass), typeDiscriminator: "profile")]
[JsonDerivedType(typeof(RecordAccountClass), typeDiscriminator: "account")]
public class RecordClass
{
    [JsonPropertyName("createdAt"), JsonRequired]
    public DateTime Created { get; set; }
}
  1. 若需保留鉴别符信息:如果业务上需要获取$type的值,可以通过JsonExtensionData捕获未映射的JSON属性,避免和框架的鉴别符逻辑冲突:
[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type", UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)]
[JsonDerivedType(typeof(RecordClass))]
[JsonDerivedType(typeof(RecordProfileClass), typeDiscriminator: "profile")]
[JsonDerivedType(typeof(RecordAccountClass), typeDiscriminator: "account")]
public class RecordClass
{
    [JsonPropertyName("createdAt"), JsonRequired]
    public DateTime Created { get; set; }

    [JsonExtensionData]
    public Dictionary<string, JsonElement>? ExtensionData { get; set; }

    // 后续可通过ExtensionData["$type"].GetString()获取鉴别符值
}
  1. 验证配置:确保你的JsonSerializerOptions没有覆盖多态相关配置(目前你的配置没问题,无需修改)。

测试效果

修复后,当JSON中出现未知鉴别符(如"$type": "guest")时,反序列化会自动回退到RecordClass基类,不再抛出异常,基类的Created属性会被正常赋值,派生类专属属性会被忽略。

内容的提问来源于stack exchange,提问作者Raymond A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:04:54