在ASP.NET Core MVC控制器中如何使用与框架一致的序列化器?
问题描述
ASP.NET Core MVC 会自动序列化从 Microsoft.AspNetCore.Mvc.ControllerBase 控制器方法返回的响应。
如下代码即可将 MyDTO 对象序列化为 JSON:
[Produces("application/json")] [HttpGet] public MyDTO Test() { return new MyDTO(); }
我希望在控制器方法内部也能使用完全相同的序列化器,且与栈中配置的所有序列化选项保持一致,请问是否可以实现?示例需求如下:
[Produces("application/json")] [HttpGet] public MyDTO Test() { var result = new MyDTO(); string serialized = this.<SOMETHING GOES HERE>(result); Console.WriteLine($"I'm about to return {serialized}"); return result; }
解决方案
可以实现,两种常用方式如下:
方式1:注入全局序列化配置(推荐,结果和框架返回完全一致)
MVC启动时已经将全局配置的序列化选项注册到了容器中,你只需要在控制器构造函数注入对应的配置类即可:
- 若使用默认的
System.Text.Json序列化器:
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using System.Text.Json; public class YourController : ControllerBase { private readonly JsonSerializerOptions _globalJsonOptions; // 注入全局Json配置,和MVC返回响应时使用的配置完全相同 public YourController(IOptions<JsonOptions> jsonOptions) { _globalJsonOptions = jsonOptions.Value.JsonSerializerOptions; } [Produces("application/json")] [HttpGet] public MyDTO Test() { var result = new MyDTO(); // 直接用全局配置序列化 string serialized = JsonSerializer.Serialize(result, _globalJsonOptions); Console.WriteLine($"I'm about to return {serialized}"); return result; } }
- 若使用
Newtonsoft.Json序列化器(即项目中配置了AddNewtonsoftJson()):
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Newtonsoft.Json; public class YourController : ControllerBase { private readonly JsonSerializerSettings _globalJsonSettings; public YourController(IOptions<MvcNewtonsoftJsonOptions> jsonOptions) { _globalJsonSettings = jsonOptions.Value.SerializerSettings; } [Produces("application/json")] [HttpGet] public MyDTO Test() { var result = new MyDTO(); string serialized = JsonConvert.SerializeObject(result, _globalJsonSettings); Console.WriteLine($"I'm about to return {serialized}"); return result; } }
方式2:调用ControllerBase自带Json方法
如果不想注入,也可以直接调用基类的Json()方法,它内部自动使用全局序列化配置:
[Produces("application/json")] [HttpGet] public MyDTO Test() { var result = new MyDTO(); // 得到的JsonResult已应用全局序列化规则 var jsonResult = Json(result); // 按需处理jsonResult即可 return result; }
内容的提问来源于stack exchange,提问作者Johannes Hoff
相关产品推荐
相关产品推荐

