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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:55:27