为什么python中的日期时间对象的json序列化不能用于日期时间对象的开箱即用

dus*_*ual 52 python serialization json simplejson

为什么json序列化不适用于datetime对象.据我了解json序列化,任何对象的基本思想都可以调用 __str__内置函数,然后将你获得的对象作为响应进行urlencode.但是在datetime的情况下,我得到以下错误

TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

虽然有__str__一种方法可以对已经可用的物体进行字符串化,但似乎有意识地决定不这样做,为什么会出现这种情况呢?

Vik*_*kas 90

不,它在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)
Run Code Online (Sandbox Code Playgroud)

正如其他人正确指出的那样,原因是json标准没有规定如何表示日期时间.

  • 如何在前端解码这个日期时间?我问的是这个十进制的解码. (4认同)
  • 很好的答案.谢谢 (3认同)
  • @Vikas谢谢.我按照你的代码但我稍微修改了`isinstance`检查部分为`if isinstance(obj,datetime.datetime):return obj.strftime('%Y /%m /%d /%H /%M /%S' )elif isinstance(obj,datetime.date):return obj.strftime('%Y /%m /%d')`. (3认同)

Mar*_*ers 10

您希望它们如何序列化?

JSON没有指定如何处理日期,因此python json库无法决定如何为您表示这些日期.这完全取决于另一方(浏览器,脚本,等等)如何处理JSON中的日期.

  • 使用默认序列化时,不必关心.你只需要能够进入json格式并退出而不会有太多麻烦.当然完全失败的日期时间肯定是错误的答案. (3认同)
  • 那就是人们需要定制的时候.开箱即用,如果我只是从python到json到python,默认情况下不常用于常见的数据类型会增加不必要的开销.此外,其他语言也有标准转换为json,因此可以简单地将其作为一个良好的默认值. (2认同)
  • 选择一种格式并不难,但这不是必须做的全部.作为一个例子,让sqlalchemy使用填充到postgresql JSON列中的字典(包含各种嵌套级别的日期时间)是非常重要的.go,ruby和javascript中的一项微不足道的任务.毕竟这只是字典/哈希序列化,但是python无法做到.Python*会根据从字符串创建日期时间可接受的格式做出选择,并且还有一般标准,因此在这种情况下,'python哲学'似乎最好是循环逻辑. (2认同)

dav*_*das 8

修补json模块的简单方法,使序列化支持日期时间.

import json
import datetime

json.JSONEncoder.default = lambda self,obj: (obj.isoformat() if isinstance(obj, datetime.datetime) else None)
Run Code Online (Sandbox Code Playgroud)

比你经常使用json序列化 - 这次将datetime序列化为isoformat.

json.dumps({'created':datetime.datetime.now()})
Run Code Online (Sandbox Code Playgroud)

导致:'{"created":"2015-08-26T14:21:31.853855"}'

请参阅更多详细信息和注意事项: StackOverflow:Python和JavaScript之间的JSON日期时间