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更改已存在excel文件的方法
May 03 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
transform python环境快速配置方法
Sep 27 Python
对python中的iter()函数与next()函数详解
Oct 18 Python
python将类似json的数据存储到MySQL中的实例
Jul 12 Python
Python字符串处理的8招秘籍(小结)
Aug 13 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 Python
学python需要去培训机构吗
Jul 01 Python
Python包资源下载路径报404解决方案
Nov 05 Python
Python 里最强的地图绘制神器
Mar 01 Python
PyQt5 QThread倒计时功能的实现代码
Apr 02 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
May 25 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 水平的题目
2007/05/30 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
如何打开php的gd2库
2017/02/09 PHP
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
推荐40款强大的 jQuery 导航插件和教程(上篇)
2012/09/14 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
pytorch sampler对数据进行采样的实现
2019/12/31 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
django使用channels实现通信的示例
2020/10/19 Python
曼联官方网上商店:Manchester United Direct
2017/07/28 全球购物
培训研修方案
2014/06/06 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
离婚被告代理词
2015/05/23 职场文书
2015入党个人自传范文
2015/06/26 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书
导游词之凤凰古城
2019/10/22 职场文书
python必学知识之文件操作(建议收藏)
2021/05/30 Python
vue实力踩坑之push当前页无效
2022/04/10 Vue.js
在python中读取和写入CSV文件详情
2022/06/28 Python