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

ASP.NET Core控制器返回父类列表时派生类成员丢失问题咨询

解决ASP.NET Core返回派生类列表时成员被忽略的问题

问题原因

默认的JSON序列化组件(System.Text.Json)只会序列化声明类型(这里是父类Foo)的属性,不会自动识别并序列化派生类的额外成员,所以返回结果里只有FooField。

解决方案

方案1:配置System.Text.Json支持多态

在项目的Program.cs中,为控制器的JSON序列化添加多态配置,明确指定父类Foo的派生类型:

var builder = WebApplication.CreateBuilder(args);

// 添加控制器并配置JSON序列化
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.TypeInfoResolverChain.Add(
            JsonSerializerOptions.Default.WithAddedDerivedTypes(typeof(Foo))
        );
    });

// 其他中间件配置...

var app = builder.Build();

// 中间件使用...

app.Run();

或者更明确地指定每个派生类:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        var polymorphismOptions = new JsonPolymorphismOptions
        {
            TypeDiscriminatorPropertyName = "$type", // 可选,添加类型标识字段
            IgnoreUnrecognizedTypeDiscriminators = true
        };
        polymorphismOptions.DerivedTypes.Add(new JsonDerivedType(typeof(BarOne), nameof(BarOne)));
        polymorphismOptions.DerivedTypes.Add(new JsonDerivedType(typeof(BarTwo), nameof(BarTwo)));
        
        options.JsonSerializerOptions.AddPolymorphism<Foo>(polymorphismOptions);
    });

方案2:改用Newtonsoft.Json(Json.NET)

如果项目更习惯用Newtonsoft.Json,可以通过以下步骤配置:

  1. 安装NuGet包:Microsoft.AspNetCore.Mvc.NewtonsoftJson
  2. 在Program.cs中替换默认序列化组件:
builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        // Newtonsoft.Json默认会处理派生类的属性,无需额外配置(如果需要类型标识可设置TypeNameHandling)
        // options.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
    });

修改后的返回结果

配置完成后,重新运行接口,就能得到你期望的结果:

[
    {
        "fooField": "Foo",
        "barOneField": "BarOne"
    },
    {
        "fooField": "Foo",
        "barTwoField": "BarTwo"
    }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:52:33