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逐行读取文件内容的三种方法
Jan 20 Python
Python实现的下载8000首儿歌的代码分享
Nov 21 Python
Python获取DLL和EXE文件版本号的方法
Mar 10 Python
python实现的守护进程(Daemon)用法实例
Jun 02 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
Sep 18 Python
python实现逐个读取txt字符并修改
Dec 24 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
python+pyqt5实现图片批量缩放工具
Mar 18 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
python小程序基于Jupyter实现天气查询的方法
Mar 27 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 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中显示数组与对象的实现代码
2011/04/18 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
使用php计算排列组合的方法
2013/11/13 PHP
thinkPHP查询方式小结
2016/01/09 PHP
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
详解webpack之scss和postcss-loader的配置
2018/01/09 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python3编码问题汇总
2016/09/06 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
服装设计行业个人的自我评价
2013/12/20 职场文书
外贸业务员工作职责
2014/01/06 职场文书
教师演讲稿大全
2014/05/16 职场文书
创先争优演讲稿
2014/09/15 职场文书
优秀教师个人总结
2015/02/11 职场文书
MySQL为id选择合适的数据类型
2021/06/07 MySQL
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers