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实现代理服务功能实例
Nov 15 Python
Python3基础之基本运算符概述
Aug 13 Python
python3批量删除豆瓣分组下的好友的实现代码
Jun 07 Python
python虚拟环境的安装配置图文教程
Oct 20 Python
Python数据结构与算法之字典树实现方法示例
Dec 13 Python
Python数据分析matplotlib设置多个子图的间距方法
Aug 03 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
使用Python opencv实现视频与图片的相互转换
Jul 08 Python
pyinstaller将含有多个py文件的python程序做成exe
Apr 29 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
Jul 14 Python
基于Python实现一个春节倒计时脚本
Jan 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面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
第五章 php数组操作
2011/12/30 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
2015/02/03 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
JavaScript模块详解
2017/12/18 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
JavaScript如何判断input数据类型
2020/02/06 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
django2 快速安装指南分享
2018/01/05 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
Python编程中类与类的关系详解
2019/08/08 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
python dataframe NaN处理方式
2019/12/26 Python
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
小班幼儿评语大全
2014/04/30 职场文书
应届生自荐信
2014/06/30 职场文书
教师群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
收入及婚姻状况证明
2014/11/20 职场文书
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis