为什么JSON序列不是datetime对象工作。 据我了解JSON序列化任何对象的基本思想可以调用__str__
内置函数,然后用urlencode您获得作为响应的对象。 但在日期时间的情况下,我得到以下错误
TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable
同时有一个__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标准未指定日期时间如何来表示。
你会怎样想他们被序列化?
JSON没有规定如何处理日期,所以python的json
库不能就如何则表示这些对你的决定。 这完全依赖于别人怎么侧(浏览器,脚本等等)在JSON处理日期。
一个简单的方法来修补JSON模块,使得序列化将支持日期时间。
import json
import datetime
json.JSONEncoder.default = lambda self,obj: (obj.isoformat() if isinstance(obj, datetime.datetime) else None)
不是使用JSON序列化,你总是这样 - 这一次被日期时间序列化为isoformat。
json.dumps({'created':datetime.datetime.now()})
导致: '{ “创建”: “2015-08-26T14:21:31.853855”}'
看到更多的细节和一些注意事项: StackOverflow上:Python和JavaScript之间的JSON日期时间
如果你想获得的编码和日期时间的解码而无需实现它,你可以使用json_tricks ,这是增加了编码和解码的各种流行类型的包装。 只要安装:
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)
免责声明:它是由我做。 因为我有同样的问题。
如果你想自动序列化任何可以被字符串化,你可以做到这一点只是标准的实施很容易:
dumps(obj, default=str)
但是请注意,这有缺点,例如,没有它就会没有额外的努力来反序列化,也许有时你只是不想序列化的东西(像一个大numpy的阵列的功能),但得到一个警告,而不是,这个方法将哪安静。
文章来源: Why does json serialization of datetime objects in python not work out of the box for datetime objects