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 相关文章推荐
探索Python3.4中新引入的asyncio模块
Apr 08 Python
在Django中限制已登录用户的访问的方法
Jul 23 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 Python
python实现对csv文件的列的内容读取
Jul 04 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
Python实现查找最小的k个数示例【两种解法】
Jan 08 Python
python实现while循环打印星星的四种形状
Nov 23 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
Dec 09 Python
Pytorch实现WGAN用于动漫头像生成
Mar 04 Python
Python包argparse模块常用方法
Jun 04 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
Mar 20 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
叶罗丽:为什么大家对颜冰这对CP非常关心,却对金茉两人十分冷漠
2020/03/17 国漫
php数组中包含中文的排序方法
2014/06/03 PHP
php 类自动载入的方法
2015/06/03 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
详解js中的几种常用设计模式
2020/07/16 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
python处理csv数据的方法
2015/03/11 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
出国导师推荐信
2014/01/16 职场文书
金融管理应届生求职信
2014/02/20 职场文书
园林系毕业生求职信
2014/06/23 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
停电通知范文
2015/04/16 职场文书
党纪处分决定书
2015/06/24 职场文书
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS