一、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)