【问题标题】:How to deserialize the datetime in a json object in python?如何反序列化python中json对象中的日期时间?
【发布时间】:2013-02-21 06:14:33
【问题描述】:

我原来的字典是

A = {                                                                                                  
    'date': datetime.date(2013, 1, 1),
    'price': 100
}

由于datetime.date 不可序列化,我添加了一个默认函数来处理它:

B = json.dumps(A, default=lambda obj:obj.isoformat() if hasattr(obj, 'isoformat') else obj)

我的问题是,如何在使用 json.loads 将其转换回原始字典时反序列化 'date' 字段?

【问题讨论】:

    标签: python json datetime


    【解决方案1】:
    from datetime import datetime
    
    def load_with_datetime(pairs, format='%Y-%m-%d'):
        """Load with dates"""
        d = {}
        for k, v in pairs:
            if isinstance(v, basestring):
                try:
                    d[k] = datetime.strptime(v, format).date()
                except ValueError:
                    d[k] = v
            else:
                d[k] = v             
        return d
    
    dump = json.dumps(A, default = f)
    json.loads(dump, object_pairs_hook=load_with_datetime)
    
    # {u'date': datetime.date(2013, 1, 1), u'price': 100}
    

    【讨论】:

    • 作为个人喜好,我检查正则表达式而不是 try/except 块。但我有处理多种格式的 object_pairs_hooks 并且需要它。
    • @JonathanVanasco -- 是的,如果您有多种格式,那么使用正则表达式可能是另一种选择,我也会查看dateutil 解析器...
    【解决方案2】:

    继续您的示例代码,

    C = json.loads(B)
    C['date'] = datetime.datetime.strptime(C['date'], '%Y-%m-%d')
    print C
    # {u'date': datetime.datetime(2013, 1, 1, 0, 0), u'price': 100}
    

    【讨论】:

    • 在执行json.loads命令时是否可以转换?我不仅有一个日期信息。谢谢!
    • 你可以参考@root的回答,或者更完整的解决方案here
    【解决方案3】:

    使用pickle模块

        import pickle
        fileop = open("timeformat.txt","wb")
        pickle.dump(A,fileop)
        fileop.close()
        print pickle.load(open("timeformat.txt","rb"))
        print A['Date']
    
    
        >>>{'date': datetime.date(2013, 1, 1), 'price': 100}
        >>>2013-01-01
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 2014-02-19
      • 2012-08-14
      • 2012-05-30
      • 2019-12-27
      • 2023-03-24
      相关资源
      最近更新 更多