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

Django接口返回JSON字符串而非标准JSON格式问题求助

问题描述

在Django中编写GET接口,期望返回标准JSON结构,但实际返回带外层引号的JSON字符串。尝试过to_dict方法无效,同结构其他接口可正常返回JSON,寻求解决办法。

当前返回结果

"{"series": [{"name": "Count of Signups", "type": "column", "data": [4, 29, 10]}, {"name": "Average of signups over last 3 Months", "type": "line", "data": [NaN, NaN, 14.0]}], "labels": ["2020-06", "2020-07", "2020-08"]}"

期望返回结果

{
    "series": [{
        "name": "Count of Signups",
        "type": "column",
        "data": [4, 29, 10]
    },
    {
        "name": "Average of signups over last 3 Months",
        "type": "line",
        "data": [NaN, NaN, 14.0]
    }],
    "labels": ["2020-06", "2020-07", "2020-08"]
}

视图代码

def Apiname(request):
    start_date = request.GET.get('start')
    end_date = request.GET.get('end')

    res = {
        "series": [{
            'name': "Count of Signups",
            'type': "column",
            'data': [],
        },
        {
            'name': "Average of signups over last 3 Months",
            'type': "line",
            'data': [],
        }],
        "labels": []
    }

    df = pd.read_csv("mycsvfile.csv")

    mask = (df['MonthYear'] >= start_date) & (df['MonthYear'] <= end_date)
    df = df.loc[mask]

    for i, row in df.iterrows():
        res['series'][0]['data'].append(row['Count_of_signups'])
        res['series'][1]['data'].append(row['signups_3mth_moving_average'])
        res['labels'].append(row['MonthYear'])

    return HttpResponse(json.dumps(res), content_type="application/json")
解决办法
  • 替换HttpResponse为JsonResponse:Django的JsonResponse会自动完成字典的序列化,避免手动json.dumps可能引发的二次序列化问题。修改返回语句:
    from django.http import JsonResponse
    
    # 其他代码保持不变
    
    return JsonResponse(res)
    
  • 处理NaN值序列化:Python原生json模块默认无法序列化NaN,手动dumps时可能触发特殊处理导致外层引号。JsonResponse默认会将NaN转为null,若需保留NaN,可添加参数:
    return JsonResponse(res, json_dumps_params={'allow_nan': True})
    
  • 排查二次序列化可能性:检查项目中间件或其他代码是否对响应内容做了额外字符串处理(比如自动添加引号)。对比同结构正常接口的返回逻辑、中间件配置差异。
  • 验证res字典类型:返回前打印type(res)确认其为<class 'dict'>,确保未被意外转为字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:50:22