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

