[英]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沒有指定如何處理日期,因此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.