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

.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:将通用响应类改为泛型实现(推荐)

从类型定义层面避免多态序列化的识别问题,不需要额外配置序列化规则:

  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; }
    }
}
  1. 修改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序列化选项中,让序列化器识别派生类型:

  1. 先实现通用的多态转换器:
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);
    }
}
  1. 在Startup的服务配置中注册转换器:
services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new PolymorphicConverter<Data>());
    });

配置后序列化时会自动获取Data类型对象的实际运行时类型(即ModpackData)进行序列化。

方案3:改用Newtonsoft.Json作为序列化器

如果项目中需要用到较多多态序列化场景,也可以把默认序列化器替换成对多态支持更友好的Newtonsoft.Json:

  1. 安装Nuget包Microsoft.AspNetCore.Mvc.NewtonsoftJson
  2. 在Startup配置中替换序列化器:
services.AddControllers()
    .AddNewtonsoftJson();

替换后Newtonsoft.Json会默认识别对象的实际运行时类型进行序列化,不需要额外配置多态规则就能正常输出ModpackData的属性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:09:28