将datetime.datetime对象序列化为JSON

5

我正在使用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__'

有没有什么想法或方法可以实现将日期时间属性包含在JSON输出中的功能?提前感谢!
3个回答

3
你可以使用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)

太好了!这正是我所需要的。 - FinnM

0
另一种方法是修改您的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())

-1

虽然被接受的答案很好,但如果您不需要任何日期格式化,您可以快速地进行直接字符串转换。

因此,像下面这样的东西应该可以工作:

str(datetime.datetime.now())

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接