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中初学者应会的一些基本的提升效率的小技巧
Mar 31 Python
Python实现PS滤镜功能之波浪特效示例
Jan 26 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
python实现定时发送qq消息
Jan 18 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
Python TCP通信客户端服务端代码实例
Nov 21 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
python 数据类型强制转换的总结
Jan 25 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 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 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
详解js常用分割取字符串的方法
2019/05/15 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
详解React 条件渲染
2020/07/08 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
尼克松手表官网:Nixon手表
2019/03/17 全球购物
幼教求职信
2014/03/12 职场文书
社区活动总结报告
2014/05/05 职场文书
工作岗位说明书模板
2014/05/09 职场文书
学校工作推荐信范文
2014/07/11 职场文书
孩子教育的心得体会
2014/09/01 职场文书
批评与自我批评范文
2014/10/15 职场文书
公司食堂管理制度
2015/08/05 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
详细谈谈MYSQL中的COLLATE是什么
2021/06/11 MySQL
Python实现双向链表
2022/05/25 Python
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js