json 格式化 datetime, date

json.dumps() 对datetime.datetime, datetime.date类型数据无法识别会报错, 需要自定义encoder 来解决
在学习flask的源码中,了解了偏函数 ,可以创建原函数的代理,支持预设参数,还可保留原来该用方式

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

from functools import partial

class DateEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, datetime.date):
return obj.strftime("%Y-%m-%d")
else:
return json.JSONEncoder.default(self, obj)


json_dump=partial(json.dumps, ensure_ascii=False, cls=DateEncoder)


调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

import copy

class User(object):

def __init__(self, id, sname):
self.id=id
self.sname=sname
self.time=datetime.datetime.now()
self.sname_zh='汉字'


def __repr__(self):
self_dict = copy.deepcopy(self.__dict__)
return json_dump(self_dict, indent=2 )


print User(1, 'admin')

>>> {
"time": "2019-08-13 14:04:21",
"sname": "admin",
"id": 1,
"sname_zh": "汉字"
}