Python中JSON序列化datetime类型的解决方案

Felix
Felix
发布时间:2026-10-13 | 2人浏览过
原创

本文解析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类型的方法与实例。希望本文能对大家有所帮助。欢迎感兴趣的朋友继续浏览本站其他技术专题,如有任何疑问或建议,欢迎留言交流。感谢各位对本站的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表