Django后端接收嵌套Json数据及解析详解


Posted in Python onJuly 17, 2019

0、干货先写在前

1、前端传值的数据必须使用JSON.stringify()传化

2、后端,通过request.body接收数据,直接使用json.loads解析,解析前,先decode一下:receive_data = json.loads(request.body.decode())。如果使用simplejson.loads(request.body),就不用decode()

下面是这个问题产生及解决的过程,还有一些可能的应用场景。

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,打印如下:

Django后端接收嵌套Json数据及解析详解

可以看到这里的数据是按照Json的格式传递的,后台也完美地进行解析,但是,如果前端传递的数据为嵌套的Json,这种写法就开始出现问题!

2、解析嵌套的Json数据

前端代码修改如下:

$.post("/login/",
    {
    "user":{
      'name':'threedog',
      'age':18,
      'sex':'男'
    },
    "password":"123456"
    },
    function (res) {
      console.log(res)
  });

这个时候后台收到的东西就有意思了:

Django后端接收嵌套Json数据及解析详解

password取值正常,但是user没能拿到值,而QueryDict的打印我们发现,原本是嵌套的字典,现在全部由两个键名合并成了新的键诸如:'user[sex]','user[age]'。这样的键到了后台是没办法按照普通字典或者json来进行解析的。

上网查,说是要使用request.raw_post_data代替request.POST就可以,然而很遗憾,报错再查之下发现,raw_post_data在Django1.4版本之后被取消,我使用的是Django1.11。再往下查,知道了要使用request.body,还要通过simplejson来解析。

但是request.body的解析仍然不顺利,前端不变,后台直接打印request.body的结果如下:

Django后端接收嵌套Json数据及解析详解

一个包含了键值对儿的二进制字符串,这个时候按网上的办法使用simplejson.loads()解析会报错:simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)。不用在这个上面纠结了,simplejson直接解析不了这个body。

后来灵感突发,发现前端在给出的数据原本就是JS中的object,并不是json的字符串,所以把前段的数据使用JSON.stringify()进行转换后,打印request.body以及通过simplejson.load()解析发现了令人惊喜的输出:

Django后端接收嵌套Json数据及解析详解

到了这一步就基本不用说啥了,完整接收了前端的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')

程序输出:

Django后端接收嵌套Json数据及解析详解

之前主要是因为写前端给数据的时候没有使用JSON.stringify()进行处理。导致后台无论什么方法解析都是一团糟。

3、简述应用场景

这个应用场景非常常见,除了我刚才提到的,前端给后台的,是嵌套的json数据的情况。还有微信小程序给后台数据,也需要JSON.stringify()处理给json,还有安卓,IOS app访问网站后台提交数据,都需要这种方式传值和解析。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
让python的Cookie.py模块支持冒号做key的方法
Dec 28 Python
python抓取网页中图片并保存到本地
Dec 01 Python
Python减少循环层次和缩进的技巧分析
Mar 15 Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
python3 shelve模块的详解
Jul 08 Python
python基础_文件操作实现全文或单行替换的方法
Sep 04 Python
Python反射用法实例简析
Dec 22 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
Jun 19 Python
Python将list中的string批量转化成int/float的方法
Jun 26 Python
python实现对图片进行旋转,放缩,裁剪的功能
Aug 07 Python
python梯度下降算法的实现
Feb 24 Python
python爬虫之利用selenium模块自动登录CSDN
Apr 22 Python
Python制作微信好友背景墙教程(附完整代码)
Jul 17 #Python
python代码编写计算器小程序
Mar 30 #Python
Django Channels 实现点对点实时聊天和消息推送功能
Jul 17 #Python
Python Django的安装配置教程图文详解
Jul 17 #Python
python按键按住不放持续响应的实例代码
Jul 17 #Python
python数据预处理之数据标准化的几种处理方式
Jul 17 #Python
解决Python正则表达式匹配反斜杠''\''问题
Jul 17 #Python
You might like
关于PHP结束标签的使用细节探讨及联想
2013/03/04 PHP
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
php中数组最简单的使用方法
2020/12/27 PHP
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
python追加元素到列表的方法
2015/07/28 Python
Python 迭代器工具包【推荐】
2016/05/06 Python
python中import reload __import__的区别详解
2017/10/16 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
PyTorch中的Variable变量详解
2020/01/07 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
出纳岗位职责模板
2013/11/27 职场文书
出纳会计岗位职责
2014/03/12 职场文书
家长学校实施方案
2014/03/15 职场文书
年终晚会主持词
2014/03/25 职场文书
作文评语集锦大全
2014/04/23 职场文书
会计岗位说明书
2014/07/29 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
2015年班干部工作总结
2015/04/29 职场文书