1. 程式人生 > >python使用json序列化datetime型別問題處理

python使用json序列化datetime型別問題處理

使用python的json模組序列化時間或者其他不支援的型別時會拋異常,例如下面的程式碼:

# -*- coding: cp936 -*-from datetime import datetime

import json

if __name__=='__main__':
  now = datetime.now()
  json.dumps({'now':now})

執行會出現下面的錯誤資訊:

Traceback(most recent call last):File"C:\Users\xx\Desktop\t.py", line 8,in<module>
    json
.dumps({'now':now})File"C:\Python27\lib\json\__init__.py", line 231,in dumps return _default_encoder.encode(obj)File"C:\Python27\lib\json\encoder.py", line 201,in encode chunks =self.iterencode(o, _one_shot=True)File"C:\Python27\lib\json\encoder.py", line 264,in iterencode return _iterencode
(o,0)File"C:\Python27\lib\json\encoder.py", line 178,indefaultraiseTypeError(repr(o)+" is not JSON serializable")TypeError: datetime.datetime(2012,12,26,11,51,33,409000)isnot JSON serializable

意思是說datetime類不支援Json序列化

我們需要對json做下擴充套件,讓它可以支援datetime型別。

classComplexEncoder(json.JSONEncoder):defdefault(self
, obj):if isinstance(obj, datetime):return obj.strftime('%Y-%m-%d %H:%M:%S')elif isinstance(obj, date):return obj.strftime('%Y-%m-%d')else:return json.JSONEncoder.default(self, obj)

在呼叫json.dumps時需要指定cls引數為ComplexEncoder

例如:

json.dumps({'now':now}, cls=ComplexEncoder)