簡體   English   中英

為什么python中的日期時間對象的json序列化不能用於日期時間對象的開箱即用

[英]Why does json serialization of datetime objects in python not work out of the box for datetime objects

為什么json序列化不適用於datetime對象。 據我了解json序列化,任何對象的基本思想都可以調用__str__ builtin函數,然后將你獲得的對象作為響應進行urlencode。 但是在datetime的情況下,我得到以下錯誤

TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable

雖然有一個__str__即一種對已經可用的對象進行字符串化的方法,但似乎有意識地決定不這樣做,為什么會出現這種情況呢?

不,它在json模塊中不起作用。 該模塊為您提供了一個默認編碼器: json.JSONEncoder 您需要擴展它以提供序列化對象的default方法的實現。 像這樣的東西:

import json
import datetime
from time import mktime

class MyEncoder(json.JSONEncoder):

    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return int(mktime(obj.timetuple()))

        return json.JSONEncoder.default(self, obj)

print json.dumps(obj, cls=MyEncoder)

正如其他人正確指出的那樣,原因是json標准沒有規定如何表示日期時間。

您希望它們如何序列化?

JSON沒有指定如何處理日期,因此python json庫無法決定如何為您表示這些日期。 這完全取決於另一方(瀏覽器,腳本,等等)如何處理JSON中的日期。

修補json模塊的簡單方法,使序列化支持日期時間。

import json
import datetime

json.JSONEncoder.default = lambda self,obj: (obj.isoformat() if isinstance(obj, datetime.datetime) else None)

比你經常使用json序列化 - 這次將datetime序列化為isoformat。

json.dumps({'created':datetime.datetime.now()})

導致:'{“created”:“2015-08-26T14:21:31.853855”}'

請參閱更多詳細信息和注意事項: StackOverflow:Python和JavaScript之間的JSON日期時間

如果你想在不必實現它的情況下獲得日期時間的編碼和解碼,你可以使用json_tricks ,它是一個為各種流行類型添加編碼和解碼的包裝器。 只需安裝:

pip install json_tricks

然后從json_tricks而不是json導入,例如:

from json_tricks import dumps, loads
json = dumps({'name': 'MyName', 'birthday': datetime.datetime(1992, 5, 23, 18, 38, 23, 37566)})
me = loads(json)

免責聲明:它是由我制作的。 因為我有同樣的問題。


如果您想自動序列化任何可以進行字符串化的內容,您可以非常輕松地使用標准實現來實現:

dumps(obj, default=str)

但請注意,這有缺點,例如,如果沒有額外的努力,它們都不會被反序列化,有時你可能只是不想序列化某些東西(比如一個大的numpy數組的函數)但是會得到一個警告,這個方法將會安靜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM