ASP.NET Core 3.1 MVC中APIController返回JSON为字符串如何解决
ASP.NET Core 3.1 API返回JSON被序列化为字符串的解决方案
问题根源
你的代码触发了两次JSON序列化,导致最终返回的是转义后的字符串格式:
- 第一次:你手动调用
JsonConvert.SerializeObject()将业务对象转为了JSON字符串 - 第二次:
Ok()方法默认会对传入的参数再次执行序列化操作,字符串类型的参数会被加上外层双引号、内部引号转义,就是你在Postman里看到的返回结果。
另外注意你贴出的代码存在变量名笔误:查询结果赋值给了ordersList,但序列化时使用的变量是casos,如果实际运行无报错属于贴代码时的手误,按实际业务变量调整即可。
修复方案
方案1(最推荐):直接返回业务对象,交由框架自动序列化
删掉手动序列化的代码,直接将查询到的集合传入Ok(),框架会自动完成序列化并设置正确的application/json响应头,客户端可以直接读取JSON对象无需额外解析:
public async Task<IActionResult> Get() { var casos = await _ordenExternaService.GetOrdenExternaCasos(); return Ok(casos); }
方案2:手动序列化后直接返回Content结果
如果你有特殊需求必须手动控制序列化逻辑(比如要使用Newtonsoft.Json的特殊配置,而非框架默认的System.Text.Json),可以直接返回ContentResult并指定正确的内容类型,避免框架二次序列化:
public async Task<IActionResult> Get() { var casos = await _ordenExternaService.GetOrdenExternaCasos(); var json = JsonConvert.SerializeObject(casos); return Content(json, "application/json"); }
补充配置说明
ASP.NET Core 3.1默认使用System.Text.Json作为序列化器,如果你要全局使用Newtonsoft.Json,需要先安装Nuget包Microsoft.AspNetCore.Mvc.NewtonsoftJson,再在Startup.cs的ConfigureServices方法中添加如下配置:
services.AddControllersWithViews() .AddNewtonsoftJson();
内容的提问来源于stack exchange,提问作者Francisco G
相关产品推荐
相关产品推荐

