使用WriteAsJsonAsync序列化JSON遇转义问题,换WriteStringAsync后Postman显示文本
JSON双重转义及返回格式问题处理
调用第三方API后,用以下代码返回响应时出现JSON双重转义:
content = await request.Content.ReadAsStringAsync(); var response = req.CreateResponse(request.StatusCode); await response.WriteAsJsonAsync(content, request.StatusCode); return response;
返回的JSON示例存在明显转义问题:
"{\"Policy_reference\":\"P12300025\"}"
完整调用及返回代码如下:
var data = new StringContent(requestBody, Encoding.UTF8, "application/json"); var request = await GetSubmissions.PostAsync("api", data); if (request.IsSuccessStatusCode) { content = await request.Content.ReadAsStringAsync(); var response = req.CreateResponse(request.StatusCode); await response.WriteAsJsonAsync(content, request.StatusCode); return response; }
更新情况
改用WriteStringAsync后,双重转义问题解决,但Postman中收到的响应被识别为文本格式(响应面板的格式选项显示为"Text",而非预期的"JSON")。
解决方法
1. 直接返回原始JSON并指定Content-Type(推荐)
问题根源是WriteAsJsonAsync会把传入的字符串当作普通值序列化,导致JSON被二次转义。直接用StringContent包装原始JSON并设置正确的媒体类型,既能避免转义,又能让客户端识别为JSON格式:
var response = req.CreateResponse(request.StatusCode); response.Content = new StringContent(content, Encoding.UTF8, "application/json"); return response;
2. 先反序列化再序列化(适合需要修改响应内容的场景)
如果需要对返回的JSON数据做修改,可以先把字符串反序列化为对象,再用WriteAsJsonAsync序列化返回,这样不会产生双重转义:
using System.Text.Json; // 反序列化原始JSON字符串为对象 var responseObj = JsonSerializer.Deserialize<object>(content); var response = req.CreateResponse(request.StatusCode); await response.WriteAsJsonAsync(responseObj, request.StatusCode); return response;
对于更新后出现的文本格式问题,本质是没有设置响应的Content-Type为application/json,上面的两种方法都能解决这个问题。
内容的提问来源于stack exchange,提问作者Jason_Hough
相关产品推荐
相关产品推荐

