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

.NET Core 6中SwaggerUI输出为字符串而非JSON的求助

解决SwaggerUI显示JSON为字符串且保持响应压缩的问题

问题原因

你当前的JsonActionResult<T>存在双重序列化问题:

  • 先通过JsonConvert.SerializeObject把对象序列化成JSON字符串
  • 再把这个字符串传给ObjectResult,而ObjectResult会根据ASP.NET Core的序列化配置再次序列化这个字符串
    最终响应内容是「JSON字符串的JSON表示」(比如原JSON是{"data":[]},实际返回的是"{\"data\":[]}"),所以SwaggerUI会把它识别成字符串类型,而非JSON对象。

解决方案

核心思路是去掉手动序列化的步骤,让ASP.NET Core框架负责对象的序列化,同时确保框架使用Newtonsoft.Json(你当前依赖的序列化库)来处理,这样既保留application/json的响应类型和压缩效果,又能让SwaggerUI正确识别JSON结构。

步骤1:配置ASP.NET Core使用Newtonsoft.Json

先确保安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet包,然后在服务配置中添加NewtonsoftJson支持:

builder.Services
  .AddControllers(options =>
  {
    options.Filters.Add(new ProducesAttribute("application/json"));
  })
  // 添加NewtonsoftJson支持并配置序列化规则
  .AddNewtonsoftJson(options =>
  {
      // 在这里填入你原本的_serializerSettings配置,比如:
      options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
      options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
      // 其他自定义序列化规则都可以放在这里
  });

步骤2:修改自定义JsonActionResult

移除手动序列化的代码,直接将原始对象传给ObjectResult,让框架处理序列化:

public class JsonActionResult<T> : IActionResult
{
    private readonly T _value;
    private readonly HttpStatusCode _statusCode;

    public JsonActionResult(HttpStatusCode statusCode, T value)
    {
        _statusCode = statusCode;
        _value = value;
    }

    public async Task ExecuteResultAsync(ActionContext context)
    {
        // 直接传入原始对象,而非手动序列化后的字符串
        var objectResult = new ObjectResult(_value)
        {
            StatusCode = (int)_statusCode,
        };
        await objectResult.ExecuteResultAsync(context).ConfigureAwait(false);
    }
}

效果验证

修改后:

  • 响应依然是application/json类型,压缩率不受影响
  • SwaggerUI会正确识别响应为JSON对象,支持直接复制格式化后的JSON内容用于测试
  • 程序调用端的逻辑完全不受影响,因为响应的JSON结构和之前一致

内容的提问来源于stack exchange,提问作者Dee J. Doena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:01:14