Django后端接收与解析前端嵌套JSON数据完整指南

慢慢来
慢慢来
发布时间:2026-10-13| 2人浏览过
原创

本文详细解析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()处理数据并采用上述方式传值和解析。

以上就是本文的全部内容,希望对大家的学习有所帮助,也欢迎大家继续支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。