派生方法的实战演练
序列化字典
import json
import datetime
d = {
't1':datetime.datetime.today(),
't2':datetime.date.today()
}
res = json.dumps(d)
print(res ) # 报错 TypeError: Object of type 'datetime' is not JSON serializable
1. 原因:json序列化python数据类型是有限的,不是所有类型都可以
2.可以被json序列化的有:字典、列表、元组、字符串、整型、浮点型、布尔型(true、false、none)
ps:即将要被序列化的数据,里里外外都必须是上述类型才可以
将上述字典在不报错的情况下序列化
方式一
手动将不符合数据类型要求的数据转成符合要求的
d = {
't1':str(datetime.datetime.today()),
't2':str(datetime.date.today())
}
res = json.dumps(d)
print(res ) # {"t1": "2022-07-28 14:50:01.971910", "t2": "2022-07-28"}
方式二
用派生的方式
1.查看dumps源码
def dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False, **kw)
2.找到 cls = None,默认形参
if cls is None:
cls = JSONEncoder
return cls(
skipkeys=skipkeys, ensure_ascii=ensure_ascii,
check_circular=check_circular, allow_nan=allow_nan, indent=indent,
separators=separators, default=default, sort_keys=sort_keys,
**kw).encode(obj)
>>>默认是调用JSONEncoder类,并且产生obj对象调用JSONEncoder类里面的encode()方法
3.在JSONEncoder类中,有default方法,发现与我们之前报错信息一致,说明报错是default方法触发的
def default(self, o):
raise TypeError("Object of type '%s' is not JSON serializable" %
o.__class__.__name__)
4. 我们如果想要避免报错,那么需要对default方法做出修改
d = {
't1':datetime.datetime.today(),
't2':(datetime.date.today())
}
class My_JSONEncoder(json.JSONEncoder):
def default(self, o): # o是json即将要序列化的数据
if isinstance(o,datetime.datetime):
return o.strftime("%Y-%m-%d %X")
elif isinstance(o,datetime.date):
return o.strftime("%Y-%m-%d")
return