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中用max()方法求最大值的介绍
May 15 Python
巧用python和libnmapd,提取Nmap扫描结果
Aug 23 Python
Python之re操作方法(详解)
Jun 14 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
python3.4爬虫demo
Jan 22 Python
django之使用celery-把耗时程序放到celery里面执行的方法
Jul 12 Python
Python使用Opencv实现图像特征检测与匹配的方法
Oct 30 Python
python实现电子词典
Mar 03 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
May 25 Python
python3实现飞机大战
Nov 29 Python
Python3.8官网文档之类的基础语法阅读
Sep 04 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中final关键字用法分析
2016/12/07 PHP
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
关于jquery css的使用介绍
2013/04/18 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
JS中传递参数的几种不同方法比较
2017/01/20 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
简单实现jquery隔行变色
2017/11/09 jQuery
深入浅出webpack之externals的使用
2017/12/04 Javascript
三种Webpack打包方式(小结)
2018/09/19 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
python分割文件的常用方法
2014/11/01 Python
python使用post提交数据到远程url的方法
2015/04/29 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
使用python实现链表操作
2018/01/26 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
Python中的heapq模块源码详析
2019/01/08 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
python批量修改交换机密码的示例
2020/09/22 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
学校办公室主任职责
2013/12/27 职场文书
餐厅筹备计划书
2014/04/25 职场文书
补充协议书
2015/01/28 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
2019年入党思想汇报
2019/03/25 职场文书
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers
Python经常使用的一些内置函数
2022/04/11 Python