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

DRF Response返回含格式字符的字符串无实际格式问题及解决

Django JsonResponse与DRF Response的JSON格式化差异解析

示例代码与测试案例

from django.http.response import JsonResponse
from rest_framework.response import Response
import json

data = {
    "data": [
        {"example":"a","id": 1},
        {"example":"b","id": 2},
        {"example":"c","id": 3},
    ], 
    "numItem": 3
}

测试案例1

# case 1
return JsonResponse(data, json_dumps_params={"indent":4})

返回格式化后的JSON(带缩进、换行的美观格式)

测试案例2

# case 2
return Response(json.dumps(data, indent=4), content_type='application/json')

返回含\n和空格的JSON字符串,但实际显示没有换行缩进(格式字符被当成普通字符串内容返回)

测试案例3

# case 3
json_data = json.dumps(data, indent=4)  
return Response(json.loads(json_data), content_type='application/json') 

返回无格式的压缩版JSON(所有换行缩进都被自动去除)


核心问题解答

1. 为什么JsonResponse能正常格式化?

JsonResponse是Django原生响应类,它的逻辑是接收Python字典/列表这类原生数据结构,内部自动调用json.dumps()做序列化,并且会把json_dumps_params里的参数(比如indent=4)传递给序列化方法,最后输出格式化后的JSON字符串,同时自动设置Content-Type为application/json。浏览器或API工具识别到这个类型后,会解析JSON内容并按照格式渲染显示。

2. 如何让DRF的Response返回正确格式化的JSON?

DRF的Response类默认会自动序列化传入的Python原生数据,不需要手动调用json.dumps(),直接通过配置DRF的渲染器即可实现格式化:

  • 全局配置(在项目settings.py中)
REST_FRAMEWORK = {
    'JSON_RENDERER_CLASS': 'rest_framework.renderers.JSONRenderer',
    'JSONRenderer': {
        'indent': 4
    }
}
  • 视图局部配置(单个视图类/函数中)
from rest_framework.renderers import JSONRenderer

class YourView(APIView):
    renderer_classes = [JSONRenderer]
    
    def get(self, request):
        # 直接传入Python原生数据结构
        return Response(data)

另外,开启项目的DEBUG=True模式时,DRF默认会返回格式化的JSON,方便调试。

3. 为什么传入JSON字符串不显示实际换行?

当你把json.dumps()生成的格式化字符串传给Response时,DRF会把这个字符串当成普通字符串数据处理,而不是JSON结构。它会再次对这个字符串做序列化,把里面的\n和空格转义成\\n和\s,最终返回的是包含转义字符的字符串,而非真正的JSON对象。浏览器或API工具接收到后,只会显示字符串的原始内容,不会解析成带格式的JSON。


内容的提问来源于stack exchange,提问作者Legend27 from that one ad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:23:19