Django后端接收与解析前端嵌套JSON数据完整指南
本文详细解析Django后端如何正确接收并解析前端传递的嵌套JSON数据。针对传统request.POST处理嵌套字典时的键名合并问题,介绍了使用request.body结合json.loads或simplejson.loads的解决方案。重点强调前端必须使用JSON.stringify()序列化数据,并对比了Django不同版本中raw_post_data的废弃情况,提供了完整的代码示例及多端应用场景。
Django处理前端嵌套JSON数据详解
本文主要分享关于Django后端处理前端数据的实战经验。
首先,前端在传递数据时,必须使用JSON.stringify()方法将对象序列化为字符串。
在后端,通过request.body接收原始数据流。在解析前,需先调用decode()方法将其转换为字符串,再使用json.loads()进行解析,代码示例为:receive_data = json.loads(request.body.decode())。若使用simplejson库直接解析request.body,则无需执行decode()操作。
下文将详细阐述该问题的产生背景、解决过程以及潜在的应用场景。
传统表单解析与嵌套JSON的问题
1、传统方式解析表单数据
以往在Django后台接收数据时,通常采用表单提交的形式。在使用Ajax传值时,也是直接通过键值对的方式将数据传递给后台,前端代码大致如下:
$.post("/login/",
{
"user":"threedog",
"password":"123456"
},
function (res) {
console.log(res)
});
在后台代码中,采用request.POST属性来接收数据:
class Login(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
print(request.POST)
print("user :",end='')
print(request.POST.get('user',None))
print("password :",end='')
print(request.POST.get('password',None))
return HttpResponse('OK')
后台接收到的数据类型为QueryDict,打印结果如下:

从打印结果可以看出,数据是以JSON格式传递的,后台也能完美解析。然而,当前端传递的数据结构为嵌套的JSON对象时,这种传统的写法就会出现问题。
使用request.body解析嵌套数据
2、解析嵌套的JSON数据
此时,前端代码需要修改为:
$.post("/login/",
{
"user":{
'name':'threedog',
'age':18,
'sex':'男'
},
"password":"123456"
},
function (res) {
console.log(res)
});
这时后台接收到的数据表现变得复杂:

虽然password字段取值正常,但user字段无法直接获取值。观察QueryDict的打印结果发现,原本嵌套的字典结构被扁平化处理,键名合并成了诸如'user[sex]'、'user[age]'的形式。这种键名结构在后台无法按照普通字典或标准JSON格式进行解析。
查阅资料后,有观点建议使用request.raw_post_data替代request.POST。然而遗憾的是,在Django 1.4版本之后该属性已被移除,而本文使用的Django版本为1.11。进一步查阅文档得知,应使用request.body,并通过simplejson库进行解析。
但是,直接解析request.body并不顺利。保持前端代码不变,直接打印request.body的结果如下:

这是一个包含键值对的二进制字符串。此时若按网络教程使用simplejson.loads()进行解析,会报错:simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)。这说明simplejson无法直接解析未经处理的body数据。
经过思考发现,前端传递的数据本质上是JavaScript对象,而非JSON字符串。因此,将前端数据使用JSON.stringify()进行转换后,打印request.body并通过simplejson.loads()解析,得到了预期的输出结果:

至此,问题基本解决。前端JSON字符串被完整接收并成功解析。如果不想安装第三方库simplejson,使用Python自带的json模块同样可以解析,只是在解析时需对request.body执行decode()操作。完整代码如下:
完整代码示例
前端代码:
$.post("/login",
JSON.stringify({
"user":{
'name':'threedog',
'age':18,
'sex':'男'
},
"password":"123456"
}),
function (res) {
console.log(res)
});
后台代码:
class Login(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
print(request.body)
receive_data = simplejson.loads(request.body)
print(receive_data)
receive_data = json.loads(request.body.decode())
print(receive_data)
return HttpResponse('OK')
程序输出结果:

之前的问题主要源于前端在提交数据时未使用JSON.stringify()进行处理,导致后台无论采用何种解析方法都无法正确获取数据。
应用场景
3、简述应用场景
该应用场景非常普遍。除了前文提到的前端向后端传递嵌套JSON数据的情况外,微信小程序向后端提交数据、安卓或iOS App访问网站后台提交数据时,均需使用JSON.stringify()处理数据并采用上述方式传值和解析。
以上就是本文的全部内容,希望对大家的学习有所帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













