ASP.NET Web API返回JSON在浏览器和Postman显示转义字符如何解决
问题根因
你遇到的多余转义字符问题是触发了两次JSON序列化导致的:
- 你手动调用
JsonConvert.SerializeObject将Test对象序列化为了带格式的JSON字符串 - 控制器方法声明的返回值类型为
string,ASP.NET Web API 默认的序列化器会把返回的字符串当作普通字符串值再做一次JSON序列化,最终就会出现外层多引号、内部引号和换行符被转义的情况。
解决方案
方案一(推荐):直接返回业务对象,交由框架自动序列化
这是最符合ASP.NET Web API设计规范的写法,不需要手动处理序列化逻辑:
- 修改控制器代码,将返回值改为
IHttpActionResult类型,直接返回对象:
namespace Test.REST.Controllers { public class TestController : ApiController { public IHttpActionResult Get() { Test.REST.Models.Test test = new Test.REST.Models.Test(2, "hello"); return Ok(test); } } }
- 如果需要全局开启JSON格式化缩进,在
WebApiConfig.cs的Register方法中添加配置即可:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 其他原有配置... config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; } }
方案二:手动构造响应,避免二次序列化
如果有特殊需求必须自己生成JSON字符串,可以直接构造HttpResponseMessage返回,指定内容类型为application/json,跳过框架的自动序列化逻辑:
namespace Test.REST.Controllers { public class TestController : ApiController { public HttpResponseMessage Get() { Test.REST.Models.Test test = new Test.REST.Models.Test(2, "hello"); string json = JsonConvert.SerializeObject(test, Formatting.Indented); System.Diagnostics.Debug.WriteLine(json); var response = new HttpResponseMessage(HttpStatusCode.OK); response.Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"); return response; } } }
两种方案执行后,浏览器和Postman中都可以直接看到格式化后的正常JSON结构,不会再有多余转义字符。
内容的提问来源于stack exchange,提问作者HowDoICSharply
相关产品推荐
相关产品推荐

