将datetime.datetime对象序列化为JSON

kt06eoxx  于 2023-01-03  发布在  其他
关注(0)|答案(3)|浏览(153)

目前正在用python做一个快速的小项目,尝试将一个对象编码成JSON字符串。我以前做过几次,除了现在没有任何问题。通常我只做下面的事情。

def ClassToEncode :
    def __init__(self, arg1, arg2, ..., argn) :
        self.attr1 = arg1
        self.attr2 = arg2
        ...
        self.attrn = argn

     ...
     def toJSON(self) :
         return json.dumps(self, default=lambda o: o.__dict__)

但问题是,我的类属性之一是datetime.datetime对象,因此抛出了以下错误

AttributeError: 'datetime.datetime' object has no attribute '__dict__'

有没有什么想法或方法可以实现将datetime属性包含到JSON输出中的功能?
先谢了!

ars1skjm

ars1skjm1#

可以对datetime对象使用isoformat()方法将其转换为ISO-8601格式的时间字符串,然后将其序列化为JSON,另一方面,对格式化的字符串调用datetime.datetime.strptime()将其转换回datetime对象:

>>> from datetime import datetime as dt
>>> now = dt.now()
>>> now
datetime.datetime(2014, 9, 4, 3, 19, 44, 214096)
>>> isonow = now.isoformat()
>>> isonow
'2014-09-04T03:19:44.214096'
>>> fmt = "%Y-%m-%dT%H:%M:%S.%f"
>>> newtime = dt.strptime(isonow, fmt)
>>> newtime
datetime.datetime(2014, 9, 4, 3, 19, 44, 214096)
nfzehxib

nfzehxib2#

另一种方法是修改toJSON()方法以使用自定义字典来自定义数据:

import datetime

def ClassToEncode :
    def __init__(self, arg1, arg2, ..., argn) :
        self.attr1 = arg1
        self.attr2 = arg2
        ...
        self.attrn = datetime.datetime.utcnow()

     ...
     def customDict(self):
        dup = self.__dict__.copy()
        # configure dup to contain fields that you want to send
        dup['attrn'] = self.createdAt.isoformat() # datetime object
        del dup['attr2'] # Some private field you may want to hide
        return dup
     def toJSON(self):
        return json.dumps(self, default=lambda o: o.customDict())
8gsdolmq

8gsdolmq3#

虽然公认的答案工作得很好,如果你不需要任何日期格式,你可以很快摆脱直接字符串转换。
因此,类似下面的内容应该可以工作

str(datetime.datetime.now())

dumps现在应该能够序列化这个字符串了。

相关问题