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

ASP.NET Core Web API代理中JSON序列化额外引号问题解决方案咨询

解决ASP.NET Core代理API返回JSON带额外引号的问题

问题根源

你遇到的额外引号是重复序列化导致的:第三方API返回的已经是合法的JSON字符串,你却用JsonSerializer.SerializeToUtf8Bytes把这个字符串当成普通字符串再次序列化,最终结果就是外层多了一层引号。

解决方案

方案1:直接输出原始JSON字节(快速修复)

修改ModifyResponse方法,跳过二次序列化,直接将原始JSON字符串转成UTF8字节写入响应体:

private static async Task ModifyResponse(HttpContext context, string json)
{
    context.Response.ContentType = "application/json";
    var jsonBytes = Encoding.UTF8.GetBytes(json);
    await context.Response.Body.WriteAsync(jsonBytes);
}

方案2:直接转发响应流(推荐,性能最优)

避免将第三方响应转成字符串,直接把响应流复制到当前请求的响应体中,既节省内存开销,又能完整保留第三方API的状态码、响应头等信息:

private async Task ForwardRequest(HttpContext context)
{
    using var httpClient = new HttpClient();
    // 构造目标API的请求地址
    var targetUrl = $"你的第三方API基础地址{context.Request.Path}{context.Request.QueryString}";

    // 构建转发的请求消息
    using var requestMsg = new HttpRequestMessage(
        new HttpMethod(context.Request.Method), 
        targetUrl
    );

    // 复制原请求的请求头(可根据需求过滤不需要的头)
    foreach (var header in context.Request.Headers)
    {
        if (!requestMsg.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()) 
            && requestMsg.Content != null)
        {
            requestMsg.Content.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray());
        }
    }

    // 复制原请求的请求体(针对POST/PUT等带请求体的方法)
    if (context.Request.ContentLength > 0)
    {
        requestMsg.Content = new StreamContent(context.Request.Body);
    }

    // 发送请求并获取响应
    using var responseMsg = await httpClient.SendAsync(
        requestMsg, 
        HttpCompletionOption.ResponseHeadersRead
    );

    // 复制第三方响应的状态码
    context.Response.StatusCode = (int)responseMsg.StatusCode;

    // 复制第三方响应的响应头
    foreach (var header in responseMsg.Headers)
    {
        context.Response.Headers.TryAdd(header.Key, header.Value.ToArray());
    }
    foreach (var header in responseMsg.Content.Headers)
    {
        context.Response.Headers.TryAdd(header.Key, header.Value.ToArray());
    }

    // 直接将第三方响应流复制到当前响应体
    await responseMsg.Content.CopyToAsync(context.Response.Body);
}

方案3:先反序列化再序列化(需修改JSON内容时用)

如果需要对第三方返回的JSON做修改(比如新增/删除字段),可以先把JSON字符串反序列化成对象,再序列化写入响应:

private static async Task ModifyResponse(HttpContext context, string json)
{
    context.Response.ContentType = "application/json";
    // 反序列化为动态对象或具体业务模型
    var responseObj = JsonSerializer.Deserialize<object>(json);
    // 这里可以对responseObj做修改操作
    await context.Response.Body.WriteAsync(JsonSerializer.SerializeToUtf8Bytes(responseObj));
}

内容的提问来源于stack exchange,提问作者DecentWig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:16:18