.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
相关产品推荐
相关产品推荐

