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 相关文章推荐
简单的编程0基础下Python入门指引
Apr 01 Python
python超简单解决约瑟夫环问题
May 12 Python
Python2.x版本中cmp()方法的使用教程
May 14 Python
python开发环境PyScripter中文乱码问题解决方案
Sep 11 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
对numpy中轴与维度的理解
Apr 18 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
python使用itchat模块给心爱的人每天发天气预报
Nov 25 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
python使用requests库爬取拉勾网招聘信息的实现
Nov 20 Python
Python图片处理之图片裁剪教程
May 27 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 Array交叉表实现代码
2010/08/05 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
PHP中file_get_contents高?用法实例
2014/09/24 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
PHP编程基本语法快速入门手册
2016/01/07 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
web css实现整站样式互相切换
2013/10/29 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
详解vue.js的devtools安装
2017/05/26 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
Python实现合并字典的方法
2015/07/07 Python
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
python框架django项目部署相关知识详解
2019/11/04 Python
Python3.9又更新了:dict内置新功能
2020/02/28 Python
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
MATCHESFASHION澳大利亚/亚太地区:英国时尚奢侈品电商
2020/01/14 全球购物
心理健康心得体会
2014/01/02 职场文书
校园文化建设方案
2014/02/03 职场文书
公司贷款承诺书
2014/05/30 职场文书
淘宝活动总结范文
2014/06/26 职场文书
学雷锋倡议书
2015/01/19 职场文书
教师节联欢会主持词
2015/07/04 职场文书
网络舆情信息简报
2015/07/21 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript