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
相关产品推荐
相关产品推荐

