Python中JSON序列化datetime类型的解决方案
本文解析Python在使用json模块序列化datetime对象时引发的TypeError异常。通过继承json.JSONEncoder并重写default方法,构建ComplexEncoder类,实现将datetime和date类型转换为指定字符串格式。调用json.dumps时传入cls参数即可解决序列化不支持类型的问题,确保时间数据能正确序列化为JSON字符串。
在Python中,若直接使用json模块尝试序列化datetime对象或其他非标准类型,程序通常会抛出异常。以下代码展示了这一常见错误场景:
# -*- coding: cp936 -*-
from datetime import datetime
import json
if __name__=='__main__':
now = datetime.now()
json.dumps({'now':now})
执行上述代码后,系统将返回如下错误堆栈信息:
Traceback (most recent call last):
File "C:\Users\xx\Desktop\t.py", line 8, in <module>
json.dumps({'now':now})
File "C:\Python27\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:\Python27\lib\json\encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Python27\lib\json\encoder.py", line 264, in iterencode
return _iterencode(o, 0)
File "C:\Python27\lib\json\encoder.py", line 178, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: datetime.datetime(2012, 12, 26, 11, 51, 33, 409000) is not JSON serializable
该错误表明,默认的JSON编码器无法处理datetime类对象,即datetime类型不支持默认的JSON序列化操作。
为解决此问题,我们需要对json模块进行扩展,使其具备处理datetime类型数据的能力。
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, date):
return obj.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self, obj)
具体做法是在调用json.dumps函数时,通过cls参数指定自定义的编码器类ComplexEncoder。
具体实现方式如下所示:
json.dumps({'now':now}, cls=ComplexEncoder)
总结
以上内容详细讲解了Python中利用json模块序列化datetime类型的方法与实例。希望本文能对大家有所帮助。欢迎感兴趣的朋友继续浏览本站其他技术专题,如有任何疑问或建议,欢迎留言交流。感谢各位对本站的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













