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中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
python检测某个变量是否有定义的方法
May 20 Python
Python实现两个list对应元素相减操作示例
Jun 09 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
python基于递归解决背包问题详解
Jul 03 Python
python文件操作的简单方法总结
Nov 07 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 28 Python
python tkinter之 复选、文本、下拉的实现
Mar 04 Python
python实现将中文日期转换为数字日期
Jul 14 Python
Python中使用Lambda函数的5种用法
Apr 01 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/05/16 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
深入理解JavaScript系列(36):设计模式之中介者模式详解
2015/03/04 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
python面向对象法实现图书管理系统
2019/04/19 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
Java程序开发中如何应用线程
2016/03/03 面试题
市场营销管理制度
2014/01/29 职场文书
质检部经理岗位职责
2014/02/19 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
大学生感恩父母演讲稿
2014/08/28 职场文书
关于学习的决心书
2015/02/05 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书
浅谈mysql哪些情况会导致索引失效
2021/11/20 MySQL
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis