为什么python中的date时间对象的json序列化不能用于date时间对象
为什么json序列化不适用于datetime对象。 正如我所了解的json序列化,任何对象的基本思想都可以调用__str__
内build函数,然后urlencode将得到的对象作为响应。 但在date时间的情况下,我得到以下错误
TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable
虽然有一个__str__
,也就是将已经存在的对象__str__
的方法,但是这似乎是一个有意识的决定,不这样做,为什么会这样呢?
不,它不会在json
模块中这样工作。 该模块为您提供了一个默认的编码器: json.JSONEncoder
。 你需要扩展它来提供你的default
方法的实现来序列化对象。 像这样的东西:
import json import datetime from time import mktime class MyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.datetime): return int(mktime(obj.timetuple())) return json.JSONEncoder.default(self, obj) print json.dumps(obj, cls=MyEncoder)
正如其他人正确指出的那样,原因是json的标准没有规定如何表示date时间。
你想如何将它们序列化?
JSON没有指定如何处理date,所以python json
库不能决定如何为你表示这些。 这完全取决于另一方(浏览器,脚本,不pipe)如何在JSON中处理date。
一个简单的方法来修补json模块,使序列化将支持date时间。
import json import datetime json.JSONEncoder.default = lambda self,obj: (obj.isoformat() if isinstance(obj, datetime.datetime) else None)
像你一样使用json序列化 – 这次datetime被序列化为isoformat。
json.dumps({'created':datetime.datetime.now()})
导致:“{”created“:”2015-08-26T14:21:31.853855“}'
看到更多的细节和一些谨慎的话: StackOverflow:Python和JavaScript之间的JSONdate时间
如果你想得到date时间的编码和解码,而不必实现它,你可以使用json_tricks ,它是一个包装,为各种stream行的types添加编码和解码。 只需安装:
pip install json_tricks
然后从json_tricks
而不是json
导入,例如:
from json_tricks import dumps, loads json = dumps({'name': 'MyName', 'birthday': datetime.datetime(1992, 5, 23, 18, 38, 23, 37566)}) me = loads(json)
免责声明:由我制作。 因为我有同样的问题。
如果你想自动序列化任何可以string化的东西,那么你可以非常容易地使用标准实现来实现:
dumps(obj, default=str)
但是请注意,这有缺点,例如,没有额外的努力就不会反序列化,有时候你可能不想序列化一些东西(比如一个大的numpy数组的函数),而是会得到一个警告,安静。