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

  


  

  

1,前端传值的数据必须使用JSON.stringify()传化

  

2,后端,通过request.body接收数据,直接使用json。负载解析,解析前,先解码一下:receive_data=https://www.yisu.com/zixun/json.loads (request.body.decode())。如果使用simplejson.loads (request.body),就不用解码()

  

下面是这个问题产生及解决的过程,还有一些可能的应用场景。

  


  

  

之前用Django后台接收数据的时候,一直采用的是表单的形式,通过Ajax传值的时候也是一样,直接通过键值对儿将值传递给后台,前端代码类似这样:

        $ . post(“/登录/?   {   “用户”:“threedog”,   “密码”:“123456”   },   函数(res) {   console.log (res)   });      

在后台采用“request.POST”进行数据接收:

        类登录(观点):   def(自我,请求):   返回渲染(请求,“login.html”)      def post(自我,请求):   打印(request.POST)   打印(“用户”,结束=")   print (request.POST.get(“用户”,没有一个)   打印(“密码:”,结束=")   print (request.POST.get(“密码”,没有一个)   返回HttpResponse(“好”)      

后台接收到的是一个QueryDict,打印如下:

  

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

  

可以看到这里的数据是按照Json的格式传递的,后台也完美地进行解析,但是,如果前端传递的数据为嵌套的Json,这种写法就开始出现问题!

  

  

前端代码修改如下:

        $ . post(“/登录/?   {   "用户":{   “名称”:“threedog”,   年龄:18岁   “性”:“男”   },   “密码”:“123456”   },   函数(res) {   console.log (res)   });      

这个时候后台收到的东西就有意思了:

  

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

  

密码取值正常,但是用户没能拿到值,而QueryDict的打印我们发现,原本是嵌套的字典,现在全部由两个键名合并成了新的键诸如:“用户[性]”,“用户(年龄)”。这样的键到了后台是没办法按照普通字典或者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:预期价值:第1行第1列(字符0)。不用在这个上面纠结了,simplejson直接解析不了这个身体。

  

后来灵感突发,发现前端在给出的数据原本就是JS中的对象,并不是json的字符串,所以把前段的数据使用JSON.stringify()进行转换后,打印request.body以及通过simplejson.load()解析发现了令人惊喜的输出:

  

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

  

到了这一步就基本不用说啥了,完整接收了前端的json字符串并解析,这里如果不想安装第三方库simplejson的话,使用python自带的json模块也是可以解析的,只是在解析时需要将request.body进行一次解码()即可。完整代码如下

  

<强>前端:

        $ . post(“/登录”,   JSON.stringify ({   "用户":{   “名称”:“threedog”,   年龄:18岁   “性”:“男”   },   “密码”:“123456”   }),   函数(res) {   console.log (res)   });      

<强>后台:

        类登录(观点):   def(自我,请求):   返回渲染(请求,“login.html”)      def post(自我,请求):   打印(request.body)   receive_data=https://www.yisu.com/zixun/simplejson.loads (request.body)   打印(receive_data)   receive_data=json.loads (request.body.decode ())   打印(receive_data)   返回HttpResponse(“好”)

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