为什么在python datetime对象的JSON序列化不是datetime对象工作开箱(Why

2019-06-24 17:42发布

为什么JSON序列不是datetime对象工作。 据我了解JSON序列化任何对象的基本思想可以调用__str__内置函数,然后用urlencode您获得作为响应的对象。 但在日期时间的情况下,我得到以下错误

TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable

同时有一个__str__即字符串化已有对象的方式,但它似乎是一个明智的决定,不去做,这就是为什么会出现这种情况?

Answer 1:

不,它不工作以这种方式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标准未指定日期时间如何来表示。



Answer 2:

你会怎样想他们被序列化?

JSON没有规定如何处理日期,所以python的json库不能就如何则表示这些对你的决定。 这完全依赖于别人怎么侧(浏览器,脚本等等)在JSON处理日期。



Answer 3:

一个简单的方法来修补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日期时间



Answer 4:

如果你想获得的编码和日期时间的解码而无需实现它,你可以使用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