Python自帶的json.dumps方法序列化數據時候若是格式化的數據中有datetime類型數據時候會提示錯誤TypeError: datetime.datetime(2012, 12, 12, 15, 47, 15) is not JSON serializable python
搜索出來的解決方案基本都是用Django的DjangoJSONEncoder來解決,爲了一個簡單的辦法引入Django這個你們夥實在有點不知所謂。不過這一點就體現了Django的資料多的優點了 json
正在下決心是否乾脆下載了Django的代碼去翻出DjangoJSONEncoder這個方法來的時候看到了官方文檔中關於json.dumps方法的一個參數(cls)說明: ide
To use a custom JSONEncoder subclass (e.g. one that overrides the default() method to serialize additional types), specify it with the cls kwarg; otherwise JSONEncoder is used.而後就看到了官方文檔中的一個Demo:
>>> import json >>> class ComplexEncoder(json.JSONEncoder): ... def default(self, obj): ... if isinstance(obj, complex): ... return [obj.real, obj.imag] ... return json.JSONEncoder.default(self, obj) ... >>> dumps(2 + 1j, cls=ComplexEncoder) '[2.0, 1.0]' >>> ComplexEncoder().encode(2 + 1j) '[2.0, 1.0]' >>> list(ComplexEncoder().iterencode(2 + 1j)) ['[', '2.0', ', ', '1.0', ']']而後簡單擴展了一個JSONEncoder出來用來格式化時間
class CJsonEncoder(json.JSONEncoder): def default(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參數便可:
json.dumps(datalist, cls=CJsonEncoder)