Django REST Framework:JSON解析器致参数格式异常?
问题分析与解决方案
你遇到的核心问题是jQuery AJAX默认会将嵌套对象序列化为表单编码格式(application/x-www-form-urlencoded),而非JSON格式。此时DRF会启用配置中的CamelCaseFormParser解析请求,该解析器会把嵌套对象拆解成config[param1]这类扁平键值对,而非序列化器期望的嵌套JSON结构。
你的DRF配置里确实包含了JSONParser和CamelCaseJSONParser,但前端未发送JSON格式的请求,导致这些JSON解析器并未被触发。
解决方案1:修改前端AJAX,发送JSON格式数据(推荐)
这是最符合RESTful规范的方式,直接让DRF使用JSON解析器处理请求,得到嵌套结构:
config = { param1: 1, param2: 2, param3: 3 } $.ajax(APIEndpoints.renderConfig.url, { type: APIEndpoints.renderConfig.method, headers: { "X-CSRFToken": csrfToken, "Content-Type": "application/json" // 指定请求格式为JSON }, data: JSON.stringify({ // 将数据转为JSON字符串 "config": config, "useWorkingConfig": true }) });
修改后,DRF会自动使用CamelCaseJSONParser解析请求,request.data将变为你期望的嵌套结构:
{ "config": { "param1": 1, "param2": 2, "param3": 3 }, "useWorkingConfig": true }
解决方案2:保持表单格式,手动重构嵌套结构
若因特殊需求必须保留表单编码格式,可在APIView中手动将扁平键值对还原为嵌套结构:
from django.http import QueryDict from rest_framework.views import APIView class YourRenderConfigAPIView(APIView): def post(self, request, *args, **kwargs): # 将QueryDict转为可操作的普通字典 raw_data = request.data.dict() # 手动重构config嵌套对象 config_data = {} for key, value in raw_data.items(): if key.startswith('config[') and key.endswith(']'): param_name = key[7:-1] config_data[param_name] = value # 替换原数据中的config字段 raw_data['config'] = config_data # 后续使用重构后的数据进行序列化验证 serializer = YourConfigSerializer(data=raw_data) if serializer.is_valid(): # 业务逻辑处理 return Response(serializer.data) return Response(serializer.errors, status=400)
补充:列表参数的处理
同理,jQuery AJAX默认会把list_param: [1,2,3]序列化为list_param[]=1&list_param[]=2的格式,使用方案1发送JSON后,会直接得到list_param: [1,2,3]的结构,无需额外处理。
内容的提问来源于stack exchange,提问作者Eddysanoli
相关产品推荐
相关产品推荐

