解決Python自帶的json序列化工具不能序列化datetime類型數據問題

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)
相關文章
相關標籤/搜索