为什么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数组的函数),而是会得到一个警告,安静。