2013-02-21 33 views
2

我原來的字典是如何在python中反序列化json對象中的日期時間?

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) 

我的問題是,我怎麼能反序列化'date'領域,而我用json.loads將其轉換回原始字典?

回答

8
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} 
+0

作爲個人喜好,我檢查了一個正則表達式而不是try/except塊。但我有處理多種格式和要求的object_pairs_hooks。 – 2013-02-21 06:52:41

+0

@JonathanVanasco - 是的,如果你有多種格式,那麼使用正則表達式可能是另一種選擇,我也會看'dateutil'解析器... – root 2013-02-21 06:57:54

1

使用鹹菜模塊

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 
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} 
+0

是否有可能做'json.loads'命令時,將其轉換?我不僅有一個日期信息。謝謝! – waitingkuo 2013-02-21 06:35:11

+1

你可以參考@root的回答,或者更完整的解決方案[這裏](http://stackoverflow.com/a/3235787/693110) – 2013-02-21 06:40:28