You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在.NET Core中实现自定义JSON序列化并设置Content-Type为application/json

解决自定义JSON序列化并确保Content-Type为application/json的问题

先帮你理清问题根源:

  • 直接返回JsonConvert.SerializeObject(res)生成的字符串时,ASP.NET Core会把它当作纯文本处理,所以响应的Content-Type是text/plain
  • 加上[Produces("application/json")]后,框架会把你返回的字符串再做一次JSON序列化——相当于把已经序列化好的JSON字符串又当成普通字符串转了一遍,所以才会出现{"Value":"value1"}被包裹成带双引号的嵌套结构。

下面给你两种实用的解决方案,按需选择:

方案1:全局配置自定义序列化规则(推荐)

如果你的API大部分接口都需要统一的自定义序列化逻辑,全局配置是最高效的方式,不用每个接口都手动处理。

操作步骤:

  1. 确保已安装Microsoft.AspNetCore.Mvc.NewtonsoftJson包(如果你用的是Json.NET,也就是JsonConvert所属的库);
  2. 在Program.cs(.NET 6+)或Startup.cs(旧版本)中配置MVC时,指定自定义序列化设置:
builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        // 这里添加你的自定义规则,比如:
        options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        options.SerializerSettings.Formatting = Formatting.Indented;
        options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
        // 其他你需要的配置,比如日期格式、枚举处理等
    });
  1. 接口中直接返回模型对象,无需手动序列化:
[Produces("application/json")]
public IActionResult YourAction()
{
    var res = new { Value = "value1" }; // 你的实际业务模型
    return Ok(res);
}

这样框架会自动用你配置的规则序列化模型,同时Content-Type会正确设置为application/json,完全避免手动序列化带来的问题。

方案2:局部返回JsonResult(适合特殊场景)

如果只是个别接口需要特殊的序列化规则,不想修改全局配置,可以直接返回JsonResult——它允许你指定自定义序列化设置,并且自动设置正确的Content-Type。

示例代码:

public IActionResult YourAction()
{
    var res = new { Value = "value1" };
    // 定义当前接口专属的序列化设置
    var customSettings = new JsonSerializerSettings
    {
        Formatting = Formatting.Indented,
        NullValueHandling = NullValueHandling.Ignore,
        // 其他个性化配置
    };
    return new JsonResult(res, customSettings);
}

这种方式既满足了自定义序列化需求,又能保证响应的Content-Type是application/json,不会出现二次序列化的问题。

内容的提问来源于stack exchange,提问作者Mr.Shanks

火山引擎 最新活动