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
相关产品推荐
相关产品推荐

