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实现类继承实例
Jul 04 Python
pandas系列之DataFrame 行列数据筛选实例
Apr 12 Python
对python中执行DOS命令的3种方法总结
May 12 Python
Python中new方法的详解
Jan 15 Python
Pycharm以root权限运行脚本的方法
Jan 19 Python
python学生管理系统开发
Jan 30 Python
python装饰器常见使用方法分析
Jun 26 Python
python安装scipy的步骤解析
Sep 28 Python
利用pytorch实现对CIFAR-10数据集的分类
Jan 14 Python
使用Keras构造简单的CNN网络实例
Jun 29 Python
Python采集股票数据并制作可视化柱状图
Apr 04 Python
尝试使用Python爬取城市租房信息
Apr 12 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 Document 代码注释规范
2009/04/13 PHP
深入解析PHP中的(伪)多线程与多进程
2013/07/01 PHP
PHP安全下载文件的方法
2016/04/07 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
js控制框架刷新
2008/08/01 Javascript
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
2013/06/06 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
Python hashlib模块用法实例分析
2018/06/12 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
2014年教师个人工作总结
2014/11/10 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
语文教师个人工作总结
2015/02/06 职场文书
Python 全局空间和局部空间
2022/04/06 Python