ControllerBase 类将对象转换为 JSON 格式并返回前端的方法

ControllerBase 类将对象转换为 JSON 格式并返回前端的方法

ASP.NET Core 框架中,ControllerBase 类提供了多种便捷的方法来将对象转换为 JSON 格式并返回给客户端。这些方法通常返回 IActionResult 或其子类(如 ObjectResult、JsonResult),框架会自动处理序列化过程。

基本都在Microsoft.AspNetCore.Mvc空间下

以下是几种常用的方法:

一、使用 Ok() 方法(最常用)

Ok() 方法返回一个状态码为 200 (OK) 的响应,并将传入的对象序列化为 JSON。这是 RESTful API 中最常见的返回成功数据的方式。

csharp 复制代码
[HttpGet("{id}")]
public IActionResult GetUser(int id)
{
    var user = new { Id = id, Name = "张三" };
    // 自动序列化为 JSON,状态码 200
    return Ok(user); 
}
二、使用JsonResult() 方法

Json() 方法显式地返回一个 JsonResult。它允许你更明确地指示返回内容是 JSON 格式,并且可以指定 JSON 序列化设置(如缩进、日期格式等)或内容类型。

csharp 复制代码
[HttpGet("{id}")]
public IActionResult GetUser(int id)
{
    var user = new { Id = id, Name = "张三" };
    // 显式返回 JsonResult
    return Json(user); 
}

// 如果需要自定义序列化设置
[HttpGet("details")]
public IActionResult GetDetails()
{
    var data = new { Message = "Hello" };
    return new JsonResult(data) 
    { 
        StatusCode = 200,
        SerializerSettings = new JsonSerializerOptions { WriteIndented = true } 
    };
}
三、使用 StatusCode() 配合对象

如果你需要返回非 200 的状态码(如 201 Created, 202 Accepted 等)同时返回 JSON 数据,可以使用 StatusCode 方法。

csharp 复制代码
[HttpPost]
public IActionResult CreateUser([FromBody] User user)
{
    // 保存用户逻辑...
    

    // 返回 201 Created 状态码,并将用户对象序列化为 JSON
    return StatusCode(201, user);

}
四、使用特定的结果辅助方法

ControllerBase 提供了一系列针对特定 HTTP 状态码的辅助方法,它们都会自动将对象序列化为 JSON:

CreatedAtAction / CreatedAtRoute‌: 返回 201 Created,常用于创建资源后返回新资源的 URI 和数据。

csharp 复制代码
return CreatedAtAction(nameof(GetUser), new { id = newUser.Id }, newUser);
BadRequest‌: 返回 400 Bad Request,通常用于验证失败时返回错误信息的 JSON。
csharp 复制代码
return BadRequest(new { error = "输入参数无效" });
NotFound‌: 返回 404 Not Found。
csharp 复制代码
return NotFound(new { message = "用户不存在" });
Unauthorized‌: 返回 401 Unauthorized。
Forbidden‌: 返回 403 Forbidden。
五、直接返回对象(配合 ApiController 特性)

如果你的控制器类添加了 ApiController 特性,你可以直接返回 POCO(普通 CLR 对象)或 Task,框架会自动将其包装为 ObjectResult 并序列化为 JSON。这虽然不是 ControllerBase 的直接方法,但是基于 ControllerBase 的现代开发最佳实践。

csharp 复制代码
[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
    [HttpGet("{id}")]
    public User GetUser(int id) // 直接返回对象,自动转为 JSON
    {
        return new User { Id = id, Name = "张三" };
    }
}
六、最佳实现方案
csharp 复制代码
	[ApiController]
	[Route("api/[controller]")]
	public class ApiControllerBase : ControllerBase
	{


		/// <summary>
		/// 用于返回成功·视图数据的通用方法
		/// </summary>
		/// <param name="message">消息</param>
		/// <param name="data">数据</param>
		/// <returns></returns>
		protected IActionResult SuccessResult(ResultType code = ResultType.Success, string message = "操作成功!", object? data = null, int count = 0)
		{

			return new JsonResult(new LayuiResponse(ResultType.Success, message, data, count));
		}

		/// <summary>
		/// 用于返回成功,视图无数据的通用方法
		/// </summary>
		/// <returns></returns>
		protected IActionResult SuccessResult()
		{
			return new JsonResult(new { code = 200, Message = "操作成功!" });
		}
		/// <summary>
		/// 用于返回失败·视图数据的通用方法
		/// </summary>
		/// <param name="message">消息</param>
		/// <param name="data">数据</param>
		/// <param name="count">总记录数</param>
		/// <returns></returns>
		protected IActionResult ErrorResult(string message, object? data = null, int count = 0)
		{
			return new JsonResult(new LayuiResponse(ResultType.Error, message, data, count));
		}

		/// <summary>
		/// 用于返回失败·无数据的通用方法
		/// </summary>
		/// <param name="message">消息</param>
		/// <param name="data">数据</param>
		/// <param name="count">总记录数</param>
		/// <returns></returns>
		protected IActionResult ErrorResult(string message = "操作失败!")
		{
			return new JsonResult(new { code = 400, Message = message });
		}


	}
相关推荐
不在逃避q30 分钟前
Trae/Vs Code/Cursor命令行无法跑npm命令
前端·arcgis·npm
夏殇之殁44 分钟前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
The Chosen One9851 小时前
高进度算法模板速记(待完善)
java·前端·算法
陈随易1 小时前
MoonBit抓包模块pcap,查看电脑的每一次联网通信
前端·后端·程序员
新中地GIS开发老师2 小时前
WebGIS开发学生作品|低空航天管理与航线规划系统
前端·javascript·webgis·三维gis开发
用户059540174462 小时前
大模型对话记忆持久化踩坑实录:用 Playwright 自动化测了 300 次,终于揪出会话丢失的真凶
前端·css
丙氨酸長鏈2 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
kyriewen3 小时前
面试官让我手写虚拟列表——AI生成的版本,快速滚动几下就白屏了
前端·javascript·面试
IT_陈寒3 小时前
Vite热更新失效?你可能漏了这个配置
前端·人工智能·后端
梅孔立4 小时前
两种免费的翻译API调用方式详解 - Edge官方API与个人缓存服务
前端·缓存·edge