.NET5 ASP.NET Core Web API自定义响应数据序列化异常问题
问题原因
你提到的整数状态码实际已经正常返回,从你贴出的响应结果可以看到statusCode: 200字段值正确,不存在整数返回异常。核心故障点是集合数据序列化失败,原因如下:
- .NET 5 内置的默认JSON序列化器为
System.Text.Json,该序列化器默认不会自动处理多态类型序列化 - 你的通用响应基类
Response中,ResponseData属性的声明类型是IEnumerable<Data>,而Data是没有定义任何属性的空基类 - 序列化执行时,会以属性的声明类型(即空基类
Data)为基准提取可序列化属性,不会自动识别你实际传入的派生类ModpackData上定义的业务属性,最终输出的数组元素全是空对象。
额外提醒:你在EF Core查询投影中直接对子查询调用
ToList()的写法,建议在执行完数据库查询、拿到内存中的集合后再组装导航属性,避免部分版本EF Core生成异常嵌套SQL导致查询性能问题或报错。
修复方案
三种方案任选其一即可,优先推荐第一种泛型实现,维护成本最低。
方案1:将通用响应类改为泛型实现(推荐)
从类型定义层面避免多态序列化的识别问题,不需要额外配置序列化规则:
- 修改
Response.cs,改为泛型基类:
using System.Collections.Generic; using TheMPDB_API.DataClasses; namespace TheMPDB_API.Responses { public class Response<T> { public int StatusCode { get; set; } public T ResponseData { get; set; } } }
- 修改
ModpacksResponse.cs,指定泛型参数为实际的集合类型:
using System.Collections.Generic; using TheMPDB_API.DataClasses; namespace TheMPDB_API.Responses { public class ModpacksResponse : Response<IEnumerable<ModpackData>> { public ModpacksResponse(IEnumerable<ModpackData> data) { StatusCode = 200; ResponseData = data; } } }
修改后序列化器可以直接识别ResponseData的实际类型为IEnumerable<ModpackData>,所有定义在ModpackData上的属性都会被正常序列化输出。
方案2:配置System.Text.Json多态转换器
如果不想改动现有类结构,可以自定义一个简单的多态序列化转换器,注册到JSON序列化选项中,让序列化器识别派生类型:
- 先实现通用的多态转换器:
public class PolymorphicConverter<TBase> : JsonConverter<TBase> where TBase : class { public override bool CanConvert(Type typeToConvert) => typeof(TBase).IsAssignableFrom(typeToConvert); public override TBase Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 接口如果不需要反序列化可以直接抛出未实现异常,也可自行补充反序列化逻辑 throw new NotImplementedException(); } public override void Write(Utf8JsonWriter writer, TBase value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value, value.GetType(), options); } }
- 在Startup的服务配置中注册转换器:
services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new PolymorphicConverter<Data>()); });
配置后序列化时会自动获取Data类型对象的实际运行时类型(即ModpackData)进行序列化。
方案3:改用Newtonsoft.Json作为序列化器
如果项目中需要用到较多多态序列化场景,也可以把默认序列化器替换成对多态支持更友好的Newtonsoft.Json:
- 安装Nuget包
Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在Startup配置中替换序列化器:
services.AddControllers() .AddNewtonsoftJson();
替换后Newtonsoft.Json会默认识别对象的实际运行时类型进行序列化,不需要额外配置多态规则就能正常输出ModpackData的属性。
内容的提问来源于stack exchange,提问作者TheKralGame
相关产品推荐
相关产品推荐

