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

C# API返回数据与实际对象不符问题求助

解决C# API多态JSON序列化仅包含基类属性的问题

问题根源

你的CloudProducts集合存储的是基类CloudProduct类型,但实际运行时是ComputeOffer或Storage子类实例。默认JSON序列化器只会序列化基类定义的属性,不会自动识别并序列化子类的额外字段,导致返回的JSON缺失子类数据。

具体解决方法

针对System.Text.Json(ASP.NET Core 3.0+默认序列化器)

有两种配置方式让序列化器支持多态:

1. 给基类添加特性标记

直接在CloudProduct基类上标注所有子类,告诉序列化器要处理这些派生类型:

using System.Text.Json.Serialization;

[JsonDerivedType(typeof(ComputeOffer))]
[JsonDerivedType(typeof(Storage))]
public class CloudProduct
{
    // 基类原有属性
    public string ProductId { get; set; }
    public decimal BasePrice { get; set; }
}

public class ComputeOffer : CloudProduct
{
    // 子类专属属性
    public decimal HourlyCharge { get; set; }
    public string InstanceSpec { get; set; }
}

public class Storage : CloudProduct
{
    // 子类专属属性
    public decimal MonthlyStorageFee { get; set; }
    public int CapacityGB { get; set; }
}

2. 全局配置序列化选项

如果不想修改基类代码,可以在项目的服务配置中全局设置多态规则:

// ASP.NET Core 6+ Program.cs
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.TypeInfoResolverChain.Insert(0, new DefaultJsonTypeInfoResolver
        {
            Modifiers =
            {
                typeInfo =>
                {
                    if (typeInfo.Type == typeof(CloudProduct))
                    {
                        typeInfo.PolymorphismOptions = new JsonPolymorphismOptions
                        {
                            DerivedTypes =
                            {
                                new JsonDerivedType(typeof(ComputeOffer)),
                                new JsonDerivedType(typeof(Storage))
                            }
                        };
                    }
                }
            }
        });
    });

针对Newtonsoft.Json(Json.NET)

如果项目用的是Newtonsoft.Json,启用TypeNameHandling即可:

1. 全局配置

在Startup/Program.cs中设置:

// ASP.NET Core 6+ Program.cs
builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
    });

2. 局部属性标记

也可以只在包含基类的属性上单独配置:

using Newtonsoft.Json;

public class CloudCalculationRequest
{
    [JsonProperty(ItemTypeNameHandling = TypeNameHandling.Auto)]
    public List<CloudProduct> CloudProducts { get; set; }
    // 其他请求属性
}

验证效果

修改后重新运行API,返回的JSON会包含子类的所有属性,序列化器会自动添加类型标识(比如$type字段),确保客户端能正确解析子类数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:52:40