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

.NET 7 API中ResponseClass序列化异常问题求助

.NET 7 API Object类型属性序列化异常(复杂结构转为空数组)的解决方法

问题原因

.NET 7 默认使用的System.Text.Json序列化器处理object类型属性时存在局限性:

  • 当Value属性编译时类型为object,但实际运行时是泛型集合(如List<Error>)或自定义复杂类型时,序列化器无法自动识别具体运行时类型,仅基于object的默认规则序列化,导致复杂结构被错误解析为空数组。
  • 默认配置下,序列化器不会保留类型元数据,仅能正确序列化object指向的基本值类型(如int、string),无法处理泛型或自定义复杂类型。

解决方案

方案1:全局配置序列化器支持多态类型

在Program.cs中修改控制器的Json序列化配置,显式声明object属性可能的实际类型,让序列化器能识别并正确处理:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.TypeInfoResolver = new DefaultJsonTypeInfoResolver
        {
            Modifiers =
            {
                typeInfo =>
                {
                    if (typeInfo.Type == typeof(object))
                    {
                        typeInfo.PolymorphismOptions = new JsonPolymorphismOptions
                        {
                            IgnoreUnrecognizedTypeDiscriminators = true,
                            TypeDiscriminatorPropertyName = "$type",
                            DerivedTypes =
                            {
                                new JsonDerivedType(typeof(int), "int"),
                                new JsonDerivedType(typeof(List<Error>), "List<Error>"),
                                new JsonDerivedType(typeof(List<Subtractions>), "List<Subtractions>")
                            }
                        };
                    }
                }
            }
        };
    });

说明:序列化后会自动在JSON中添加$type字段标识实际类型,后续新增需要支持的类型,直接在DerivedTypes列表中添加即可。

方案2:局部为Value属性添加多态特性

如果不想全局修改配置,可以直接在ResponseClass的Value属性上添加特性,仅针对该属性生效:

public class ResponseClass
{
    public int Code { get; set; }
    
    [JsonPolymorphic(TypeDiscriminatorPropertyName = "$type")]
    [JsonDerivedType(typeof(int), "int")]
    [JsonDerivedType(typeof(List<Error>), "List<Error>")]
    [JsonDerivedType(typeof(List<Subtractions>), "List<Subtractions>")]
    public object Value { get; set; }
    
    public string Name { get; set; }
}

说明:该方式更灵活,仅对Value属性的序列化逻辑做修改,不影响其他属性或接口。

方案3:改用泛型ResponseClass(类型明确场景)

如果接口返回的Value类型是固定的,将ResponseClass改为泛型类可以从根源避免object类型带来的序列化问题:

public class ResponseClass<T>
{
    public int Code { get; set; }
    public T Value { get; set; }
    public string Name { get; set; }
}

修改控制器方法:

[HttpPost]
[Route("v1/getStatus")]
public IActionResult GetStatus(RequestClass request)
{
     var response = _service.GetStatus(request); // 服务层返回对应泛型实例,如ResponseClass<List<Error>>
     return Ok(response);
}

说明:泛型方式类型安全性更高,序列化无歧义,但需要根据不同返回类型定义对应的泛型实例,适合类型明确的接口场景。

验证

配置完成后重新测试接口:

  • 调试时response对象的Value数据完整,序列化后的JSON会正确展示复杂结构内容,不再是空数组。
  • 使用多态配置的场景下,JSON会包含$type字段标识实际类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:13:29