【问题标题】:Serialize datetime.datetime object as JSON将 datetime.datetime 对象序列化为 JSON
【发布时间】:2014-10-28 19:56:56
【问题描述】:

目前正在用 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 输出中的功能??

提前致谢!

【问题讨论】:

    标签: json python-2.7 datetime object encode


    【解决方案1】:

    您可以在 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'
    >>> format = "%Y-%m-%dT%H:%M:%S.%f"
    >>> newtime = dt.strptime(isonow, format)
    >>> newtime
    datetime.datetime(2014, 9, 4, 3, 19, 44, 214096)
    

    【讨论】:

    • 太棒了!这正是我所需要的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 2016-12-22
      • 2018-07-20
      • 2021-12-16
      相关资源
      最近更新 更多