You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:54:04