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爬虫
Dec 25 Python
Python实现的弹球小游戏示例
Aug 01 Python
Python装饰器用法实例总结
May 26 Python
对python for 文件指定行读写操作详解
Dec 29 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
Python元组常见操作示例
Feb 19 Python
python中dict()的高级用法实现
Nov 13 Python
tensorflow之并行读入数据详解
Feb 05 Python
python列表返回重复数据的下标
Feb 10 Python
Python实现从N个数中找到最大的K个数
Apr 02 Python
python+requests接口压力测试500次,查看响应时间的实例
Apr 30 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 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事务处理实例详解
2014/07/11 PHP
php递归json类实例
2014/12/02 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
基于node实现websocket协议
2016/04/25 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
Python中整数的缓存机制讲解
2019/02/16 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
python的re模块使用方法详解
2019/07/26 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
html5绘制时钟动画
2014/12/15 HTML / CSS
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
盛大二次面试题
2016/11/18 面试题
金融专业个人求职信范文
2013/11/28 职场文书
新领导上任欢迎词
2014/01/13 职场文书
《中彩那天》教学反思
2014/02/22 职场文书
应聘教师自荐书
2014/06/16 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android
Linux中sftp常用命令整理
2022/06/28 Servers