Python JSON编码器支持日期时间?
有什么优雅的方法可以使Python JSON编码器支持日期时间?一些第三者模块还是容易破解?
我正在使用tornado的数据库包装程序从db获取一些行以生成json。查询结果包括一个常规的MySQL时间戳列。
令人讨厌的是,Python的默认json编码器不支持自己的日期时间类型,这种类型在所有类型的数据库查询中都很常见。
我不想修改Python自己的json编码器。有什么好的做法吗?非常感谢!
ps:通过修改Python JSON编码器默认方法,我发现了一个肮脏的骇客:
更改:
def default(self, o): raise TypeError(repr(o) + " is not JSON serializable")
至:
def default(self, o): from datetime import date
from datetime import datetime
if isinstance(o, datetime):
return o.isoformat()
elif isinstance(o, date):
return o.isoformat()
else:
raise TypeError(repr(o) + " is not JSON serializable")
好吧,这将仅是针对开发环境的临时解决方案。
但是对于长期解决方案或生产环境而言,这非常丑陋,并且每次部署到新服务器时都必须进行修改。
有没有更好的办法?我不想修改Python代码本身,也不想修改Tornado源代码。我可以使用自己的项目代码来做到这一点吗?最好以一个步伐。
非常感谢!
回答:
该文档建议将
JSONEncoder子类化并实现您自己的默认方法。似乎您基本上就在那儿,这不是“肮脏的骇客”。
日期未由默认编码器处理的原因是,JSON中没有日期的标准表示形式。有人使用该格式/Date(1198908717056)/
,但我个人更喜欢ISO格式。
import jsonimport datetime
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, (datetime.datetime, datetime.date, datetime.time)):
return obj.isoformat()
elif isinstance(obj, datetime.timedelta):
return (datetime.datetime.min + obj).time().isoformat()
return super(DateTimeEncoder, self).default(obj)
now = datetime.datetime.now()
encoder = DateTimeEncoder()
encoder.encode({"datetime": now, "date": now.date(), "time": now.time()})
> {"datetime": "2019-07-02T16:17:09.990126", "date": "2019-07-02", "time": "16:17:09.990126"}
以上是 Python JSON编码器支持日期时间? 的全部内容, 来源链接: utcz.com/qa/403160.html