flask jsonify之序列化时的default函数、jsonify序列化自定义对象

目录

1.看源码

2、重写默认的default函数,实现自己的序列化机制

3、把对象转化成字典

3.1 __dict__的方式

3.2、定义keys和__getitem__的方式

4、最终的代码实现

5、关于default函数的其他知识


1.看源码

打开site-package,flask,json,__init__.py

jsonify回去调用default()函数,我们最关心的就是重写default方法

我们是不是调用jsonify就一定会调用default呢?答案:不是!

发现如上图所示,并没有进入jsonify的default方法里,而是直接把字典给序列化出来了。

那么什么时候会调用default呢?

结论:如果flask知道如何序列化你传入进来的数据结构的时候,是不会调用default,因为知道如何序列化就直接帮我们序列化了,但是如果我们要序列化一个对象,是我们的user模型,flask默认是不知道怎么去序列化这个模型的,那么就会去调用default函数,为什么会这样的,原因就在于flask不知道怎么序列化,但是它会给我们一个途径,让我们来指明这个数据结构应该怎么序列化,换句话说,default函数最主要的就是我们需要在内部把不能序列化的结构转化为可以序列化的结构,比如我们传入进来的是一个user,user是不能序列化的,但是如果我们可以把user转化成字典,字典是可以序列化的,那么这样就能完成user对象的序列化了,虽然user作为一个模型他不能序列化,但是我们可以把他的信息读取出来,转化为一个字典,从而保证我们整个序列化的成功执行。可以看到default里面的源码,传入的user对象既不是datetime也不是date、uuid.UUID、__html__,所以最后会抛出一个异常

所以我们要在default中把不能序列化的user转化成可以序列化的格式。

所以我们继承,然后重写default方法,在重写的函数中实现user的可序列化就OK了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值