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,可以通过以下步骤配置:
- 安装NuGet包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在
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
相关产品推荐
相关产品推荐

