0%

python的json不能序列化datetime类型数据问题

一、json序列化时默认支持的数据类型

Python JSON
dict object
list, tuple array
str string
int, float, int- & float-derived Enums number
True true
False false
None null
除此之外的数据类型,就需要我们个性化定制。

二、定制支持datetime类型

官方文档中关于json.dumps方法的一个参数(cls)说明:

To use a custom JSONEncoder subclass (e.g. one that overrides the default() method to serialize additional types), specify it with the cls kwarg; otherwise JSONEncoder is used.

官方文档中的一个Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> import json
>>> class ComplexEncoder(json.JSONEncoder):
... def default(self, obj):
... if isinstance(obj, complex):
... return [obj.real, obj.imag]
... return json.JSONEncoder.default(self, obj)
...
>>> dumps(2 + 1j, cls=ComplexEncoder)
'[2.0, 1.0]'
>>> ComplexEncoder().encode(2 + 1j)
'[2.0, 1.0]'
>>> list(ComplexEncoder().iterencode(2 + 1j))
['[', '2.0', ', ', '1.0', ']']

定制支持datetime类型需要完成以下步骤:

  • 定义一个继承自JSONEncoder的类,重写里面的default方法,定义对datetime类型数据的处理方法
  • 在用dumps函数序列化时,参数cls的值就设为我们上面写的这个子类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

import json
from datetime import datetime


time = datetime(1987,2,5)

class DatetimeJsonEncoder(json.JSONEncoder):
'''这是JSONEncoder的子类'''
def default(self,obj): # pylint: disable = method-hidden
'''这是重写的default方法
:参数 obj: 需要序列化的对象
'''
# 如果是datetime对象,就按照我们自定义的格式转化为列表
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, date):
return obj.strftime('%Y-%m-%d')
else:
# 其他的基本类型数据,就按照JSONEncoder自己的方法处理
return json.JSONEncoder.default(self,obj)

string = json.dumps({'name':'Alex Brightman','birthday':time},cls=DatetimeJsonEncoder)

------------- 本文结束 感谢您的阅读-------------