Datetime.date(2014, 4, 25) не JSON сериализуется в Django
Я следовал Как преодолеть "datetime.datetime, а не JSON serializable" в python?, но это не помогает
Я пробовал этот код
>>> import datetime
>>> a =datetime.date(2014, 4, 25)
>>> from bson import json_util
>>> b = json.dumps(a,default = json_util.default)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/home/.../python2.7/site-packages/bson/json_util.py", line 256, in default
raise TypeError("%r is not JSON serializable" % obj)
TypeError: datetime.date(2014, 4, 25) is not JSON serializable
Может кто-нибудь помочь мне с сериализатором и десериализатором datetime.date
.
Ответы
Ответ 1
Вы также можете сделать это:
def date_handler(obj):
return obj.isoformat() if hasattr(obj, 'isoformat') else obj
print json.dumps(data, default=date_handler)
От здесь.
Обновить в соответствии с комментарием J.F.Sebastian
def date_handler(obj):
if hasattr(obj, 'isoformat'):
return obj.isoformat()
else:
raise TypeError
print json.dumps(data, default=date_handler)
Ответ 2
Преобразовать дату в строку и затем попробовать,
a = str( datetime.now() )
Ответ 3
См. раздел Расширение кодировщика из документов json package https://docs.python.org/2/library/json.html
Я использовал этот метод и нашел его достаточно эффективным. Я думаю, что это то, что вы ищете.
import json
class DatetimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%dT%H:%M:%SZ')
elif isinstance(obj, date):
return obj.strftime('%Y-%m-%d')
# Let the base class default method raise the TypeError
return json.JSONEncoder.default(self, obj)
json.dumps(dict,cls=DatetimeEncoder)
Ответ 4
Вы можете добавить кодер времени даты в функцию JSON jumps при обработке запросов модели, это немного настроено, поскольку у меня возникли проблемы с анализируемым состоянием базовой модели django.
import datetime
import decimal
from django.db.models.base import ModelState
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if hasattr(obj, 'isoformat'):
return obj.isoformat()
elif isinstance(obj, decimal.Decimal):
return float(obj)
elif isinstance(obj, ModelState):
return None
else:
return json.JSONEncoder.default(self, obj)
Затем используйте этот класс с вашими дамами json
b = json.dumps(a, cls = DateTimeEncoder)
Ответ 5
Я нашел это неоценимым, особенно после обновления Django с 1.7 до 1.9. Большая часть этого из блога http://arthurpemberton.com/2015/04/fixing-uuid-is-not-json-serializable
Поместите это в models.py прямо под импортом. Он также позаботится о UUID для вас.
from uuid import UUID
import datetime
JSONEncoder_olddefault = JSONEncoder.default
def JSONEncoder_newdefault(self, o):
if isinstance(o, UUID): return str(o)
if isinstance(o, datetime.datetime): return str(o)
return JSONEncoder_olddefault(self, o)
JSONEncoder.default = JSONEncoder_newdefault