.NET7 Web API中System.Text.Json多态序列化类型鉴别器缺失问题
解决ASP.NET Web API中System.Text.Json多态序列化不生成类型鉴别器的问题
问题根源
ASP.NET Web API默认会根据返回值的实际具体类型(如SuccesfulResult)而非方法声明的抽象基类型(Result)来生成序列化元数据。这就导致你在基类上配置的[JsonPolymorphic]和[JsonDerivedType]属性未被触发,因此不会输出类型鉴别器$type。
而直接调用JsonSerializer.Serialize时,你明确指定了序列化的目标类型为Result,所以多态配置正常生效。
可行解决方案
方案1:全局注册多态类型(推荐)
在Program.cs中通过AddJsonOptions全局配置Result类型的多态规则,这样所有返回Result的控制器方法都会自动应用多态序列化:
builder.Services.AddControllers() .AddJsonOptions(options => { // 为抽象基类型Result注册多态派生类型 options.JsonSerializerOptions.AddJsonDerivedType(typeof(Result), typeof(SuccesfulResult), "ok"); options.JsonSerializerOptions.AddJsonDerivedType(typeof(Result), typeof(ErrorResult), "fail"); });
方案2:控制器内手动指定序列化类型
如果不需要全局配置,可以在控制器方法中手动以Result类型序列化对象,返回ContentResult:
[HttpGet("ok")] public IActionResult GetSuccesfulResult() { var result = new SuccesfulResult(); var json = JsonSerializer.Serialize(result, typeof(Result)); return Content(json, "application/json"); } [HttpGet("fail")] public IActionResult GetFailResult() { var result = new ErrorResult("Whoops..."); var json = JsonSerializer.Serialize(result, typeof(Result)); return Content(json, "application/json"); }
方案3:使用JsonResult指定序列化配置
返回JsonResult时,显式传入包含多态配置的JsonSerializerOptions:
[HttpGet("ok")] public JsonResult GetSuccesfulResult() { var options = new JsonSerializerOptions(); options.AddJsonDerivedType(typeof(Result), typeof(SuccesfulResult), "ok"); options.AddJsonDerivedType(typeof(Result), typeof(ErrorResult), "fail"); return new JsonResult(new SuccesfulResult(), options); }
效果验证
配置完成后,接口将返回包含类型鉴别器的预期响应:
- GET /api/ok →
{ "$type": "ok" } - GET /api/fail →
{ "$type": "fail", "error": "Whoops..." }
内容的提问来源于stack exchange,提问作者MarengoHue
相关产品推荐
相关产品推荐

