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 и десериализатором.

5 Solutions collect form web for “datetime.date (2014, 4, 25) не является JSON-сериализуемым в Django”

Вы также можете сделать это:

 def date_handler(obj): return obj.isoformat() if hasattr(obj, 'isoformat') else obj print json.dumps(data, default=date_handler) 

Отсюда .

Обновление согласно комментариям JFSebastian

 def date_handler(obj): if hasattr(obj, 'isoformat'): return obj.isoformat() else: raise TypeError print json.dumps(data, default=date_handler) 

Преобразуйте дату в строку, а затем попробуйте,

 a = str( datetime.now() ) 

См. Раздел Расширение кодировщика из документации 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) 

Вы можете добавить кодер времени даты в функцию 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) 

Я нашел это неоценимым, особенно после обновления 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 
  • django-rest-framework 3.0 создавать или обновлять в вложенном сериализаторе
  • Создание файла XML из данных модели
  • Как сделать simplejson сериализуемым классом
  • Почему Django Rest Framework препятствует проверке уровня модели?
  • Получить текущего пользователя в сериализаторе модели
  • Django.rest_framework: как сериализовать одно для многих?
  • Как получить дополнительный столбец в реляционной модели в сериализаторе Django-rest-framework?
  • Django Rest Framework: сериализация данных из вложенных json-полей в простой объект
  • Динамически исключать или включать поле в сериализатор рамки Django REST
  • API в Django, но основанный на protobuf
  • AttributeError при использовании Django Rest Framework с сериализаторами
  • Python - лучший язык программирования в мире.