.Net Core 3.1 Controller返回结果如何按需忽略未请求及空属性
解决方案
该需求完全可以在 .NET Core 3.1 中实现,以下是两种主流可落地的实现方案:
方案1:使用 .NET Core 3.1 默认的 System.Text.Json 序列化器
不需要引入额外第三方包,直接通过动态配置序列化规则实现:
- 控制器接口接收用户是否需要返回Bar的标识参数(例如Query参数
includeBar) - 不需要返回Bar时将Bar属性设为null,配合序列化配置忽略null值字段即可
- 需要返回Bar时,先执行高成本的Bar数据获取逻辑,哪怕获取结果为null也要初始化空的Bar对象
示例代码:
[ApiController] [Route("api/[controller]")] public class FooController : ControllerBase { [HttpGet] public IActionResult Get([FromQuery] bool includeBar = false) { var foo = new Foo { Name = "Test" }; if (includeBar) { // 此处执行高成本的Bar数据获取逻辑 var bar = GetHighCostBarData(); // 就算获取结果为null也初始化空Bar对象,保证序列化后输出对应结构 foo.Bar = bar ?? new Bar(); return Ok(foo); } // 不需要返回Bar的场景,配置序列化忽略null值字段 var serializeOptions = new JsonSerializerOptions { IgnoreNullValues = true }; foo.Bar = null; return new JsonResult(foo, serializeOptions); } // 模拟高成本获取Bar数据的方法 private Bar GetHighCostBarData() { // 可替换为数据库查询、第三方接口调用等逻辑 return null; } }
方案2:使用 Newtonsoft.Json(Json.NET)的条件序列化特性
如果项目已经切换到Newtonsoft.Json作为序列化器,可以用自带的条件序列化规则简化代码:
- 首先安装对应Nuget包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson,并在Startup.cs中注册配置
services.AddControllers() .AddNewtonsoftJson();
- 在Foo类中新增
ShouldSerializeBar方法,Newtonsoft.Json会自动识别该方法判断是否序列化Bar属性
public class Foo { public string Name {get; set;} public Bar Bar {get; set;} public bool ShouldSerializeBar() { var context = new HttpContextAccessor().HttpContext; if (context == null) return false; // 从请求参数中读取是否需要返回Bar的标识 return bool.TryParse(context.Request.Query["includeBar"], out var include) && include; } }
- 控制器逻辑简化为只处理Bar数据的赋值即可
[HttpGet] public IActionResult Get([FromQuery] bool includeBar = false) { var foo = new Foo { Name = "Test" }; if (includeBar) { var bar = GetHighCostBarData(); foo.Bar = bar ?? new Bar(); } return Ok(foo); }
两种方案都可以完全匹配需求:
- 用户未请求Bar时,返回JSON仅包含Name字段
- 用户请求Bar时,哪怕Bar没有实际数据,也会返回包含Data、Format属性的Bar结构
内容的提问来源于stack exchange,提问作者Hafinator
相关产品推荐
相关产品推荐

