当前位置: 首页 > 面试题库 >

Python JSON编码器支持日期时间?

赵君植
2023-03-14
问题内容

有什么优雅的方法可以使Python JSON编码器支持日期时间?一些第三者模块还是容易破解?

我正在使用tornado的数据库包装程序从db获取一些行以生成json。查询结果包括一个常规的MySQL时间戳列。

令人讨厌的是,Python的默认json编码器不支持自己的日期时间类型,这种类型在所有类型的数据库查询中都很常见。

我不想修改Python自己的json编码器。有什么好的做法吗?非常感谢!

ps:通过修改Python JSON编码器默认方法,我发现了一个肮脏的骇客:

更改:

def default(self, o):
    raise TypeError(repr(o) + " is not JSON serializable")

至:

def default(self, o):
    from datetime import date
    from datetime import datetime
    if isinstance(o, datetime):
        return o.isoformat()
    elif isinstance(o, date):
        return o.isoformat()
    else:
        raise TypeError(repr(o) + " is not JSON serializable")

好吧,这将仅是针对开发环境的临时解决方案。

但是对于长期解决方案或生产环境而言,这非常丑陋,并且每次部署到新服务器时都必须进行修改。

有没有更好的办法?我不想修改Python代码本身,也不想修改Tornado源代码。我可以使用自己的项目代码来做到这一点吗?最好以一个步伐。

非常感谢!


问题答案:

该文档建议将
JSONEncoder子类化并实现您自己的默认方法。似乎您基本上就在那儿,这不是“肮脏的骇客”。

日期未由默认编码器处理的原因是,JSON中没有日期的标准表示形式。有人使用该格式/Date(1198908717056)/,但我个人更喜欢ISO格式。

import json
import datetime


class DateTimeEncoder(json.JSONEncoder):

    def default(self, obj):
        if isinstance(obj, (datetime.datetime, datetime.date, datetime.time)):
            return obj.isoformat()
        elif isinstance(obj, datetime.timedelta):
            return (datetime.datetime.min + obj).time().isoformat()

        return super(DateTimeEncoder, self).default(obj)

now = datetime.datetime.now()
encoder = DateTimeEncoder()
encoder.encode({"datetime": now, "date": now.date(), "time": now.time()})
> {"datetime": "2019-07-02T16:17:09.990126", "date": "2019-07-02", "time": "16:17:09.990126"}


 类似资料:
  • 有没有什么优雅的方法使Python JSON编码器支持datetime?一些第三方模块或简易黑客? 我正在使用tornado的数据库包装器从db获取一些行来生成一个json。查询结果包括一个常规的MySQL时间戳列。 Python默认的json编码器不支持自己的日期时间类型,这在各种数据库查询中都很常见,这很烦人。 我不想修改Python自己的json编码器。有什么好的做法吗?谢谢! ps:我通过

  • 问题内容: 是的,我知道FAQ会假装回答此问题,但实际上并非如此。相反,它指示您从源代码构建项目(并且构建说明非常复杂)。那种打败了整个观点:) 让我们省去世界上每个人的麻烦,即不必再构建另一个开源项目,以了解它是否真正解决了他们的问题。Xuggler支持哪些编解码器? 问题答案: FAQ不能回答这个问题的原因是,随着我们发布新版本,它会不断变化,并且要使文档中的列表保持最新状态会花费很长时间。但

  • SRS哪些协议支持hevc编码 支持hevc编码的协议: rtmp httpflv hls srt: 具体见srt codec wiki FLV视频头信息 因为rtmp在2012年后,协议没有更新,对hevc编码格式的支持在rtmp协议官方文档中没有明确定义。 国内cdn厂商通过修改<video>中CodecID的定义,将flv中的hevc codecid定义为12。 Field Type Com

  • 在Craft CMS中使用这个细枝代码,我得到如下所示的错误。Craft CMS的制造商告诉我,小枝“date”不支持像“janvier 2016”这样的本地化月份名称,但英文“janvier 2016”也可以。 这是真的吗? 我的小枝:{%set queryStartDate=date([month,year]| join(“”))%} 错误:DateTime::_construct():无法分

  • 问题内容: 我将Java 8用于新项目。 我正在尝试在Java 8中使用新的日期和时间api,但是我不知道是否JPA 2.1完全支持此新的日期和时间API。 请分享您在JPA对Java 8中新日期和时间API的支持中的经验/意见。 我可以通过JPA 2.1安全地在Java 8中使用新的日期和时间api吗? 更新: 我正在使用Hibernate(4.3.5.Final)作为JPA实现。 问题答案: