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设置socket代理的方法
Jan 14 Python
python print 按逗号或空格分隔的方法
May 02 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
Sep 04 Python
Python中psutil的介绍与用法
May 02 Python
python实现五子棋人机对战游戏
Mar 25 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
Python_查看sqlite3表结构,查询语句的示例代码
Jul 17 Python
python网络爬虫 CrawlSpider使用详解
Sep 27 Python
使用Django搭建网站实现商品分页功能
May 22 Python
Selenium及python实现滚动操作多种方法
Jul 21 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 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
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
我的php学习笔记(毕业设计)
2012/02/21 PHP
微信支付开发交易通知实例
2016/07/12 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
在模板页面的js使用办法
2010/04/01 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
javascript实现可键盘控制的抽奖系统
2016/03/10 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
Angular使用$http.jsonp发送跨站请求的方法
2017/03/16 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
浅析JavaScript中的事件委托机制跟深浅拷贝
2021/01/20 Javascript
Python二分查找详解
2015/09/13 Python
Python中基础的socket编程实战攻略
2016/06/01 Python
python opencv 直方图反向投影的方法
2018/02/24 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
Java的基础面试题附答案
2016/01/10 面试题
公司财务总监岗位职责
2013/12/14 职场文书
大学毕业生自荐书怎么写?
2014/01/06 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL