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爬虫之爬取糗事百科段子
Feb 17 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
用Python实现数据的透视表的方法
Nov 16 Python
Python批量生成特定尺寸图片及图画任意文字的实例
Jan 30 Python
500行Python代码打造刷脸考勤系统
Jun 03 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
Python变量及数据类型用法原理汇总
Aug 06 Python
浅析NumPy 切片和索引
Sep 02 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 Python
只用40行Python代码就能写出pdf转word小工具
May 31 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
JAVA/JSP学习系列之二
2006/10/09 PHP
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
JQuery中getJSON的使用方法
2010/12/13 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
Javascript图像处理思路及实现代码
2012/12/25 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
实用框架(iframe)操作代码
2014/10/23 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
学习vue.js计算属性
2016/12/03 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
node.js通过url读取文件
2020/10/16 Javascript
Python中转换角度为弧度的radians()方法
2015/05/18 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
详解Python学习之安装pandas
2019/04/16 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
学生会竞选自荐信
2013/10/12 职场文书
室内设计自我鉴定
2013/10/15 职场文书
经典的班主任推荐信
2013/10/28 职场文书
销售经理竞聘书
2014/03/31 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
歌剧魅影观后感
2015/06/05 职场文书
Python面试不修改数组找出重复的数字
2022/05/20 Python