Django后端接收嵌套Json数据及解析详解

作者:三级狗 时间:2021-04-24 20:11:38 

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访问网站后台提交数据,都需要这种方式传值和解析。

来源:https://blog.csdn.net/Three_dog/article/details/81192923

标签:django,后端,json,数据,解析
0
投稿

猜你喜欢

  • 教你制作IBM LOGO的方法

    2007-10-23 13:34:00
  • 概念性产品设计

    2008-06-11 12:57:00
  • 教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码

    2023-08-29 12:08:18
  • Python ArcPy批量掩膜、重采样大量遥感影像的操作

    2023-12-23 14:48:55
  • sqlserver 数据库连接字符串中的可选项收集

    2011-10-24 19:48:37
  • Python里字典的基本用法(包括嵌套字典)

    2023-04-26 14:51:00
  • xhtml+css页面制作过程中问题的解决方案

    2008-08-05 18:00:00
  • Git基础学习之tag标签操作详解

    2023-01-01 08:27:20
  • Go语言执行系统命令行命令的方法

    2024-04-27 15:38:29
  • 离线状态下在jupyter notebook中使用plotly实例

    2022-04-19 18:05:59
  • Pandas聚合运算和分组运算的实现示例

    2023-11-10 03:49:14
  • 详谈js遍历集合(Array,Map,Set)

    2024-04-16 09:29:53
  • Python对列表中的各项进行关联详解

    2023-10-26 20:19:34
  • 深入浅析Python中join 和 split详解(推荐)

    2022-09-19 17:43:38
  • Linux下Python获取IP地址的代码

    2023-02-27 10:30:07
  • python使用matplotlib绘制柱状图教程

    2021-01-29 20:20:00
  • ES6新语法Object.freeze和Object.seal基本使用

    2024-04-10 16:10:04
  • python中常用的各种数据库操作模块和连接实例

    2024-01-18 16:29:20
  • 很有意思的SQL多行数据拼接

    2024-01-28 02:08:56
  • IE中选择符的4095限制

    2009-10-09 13:25:00
  • asp之家 网络编程 m.aspxhome.com