Обновлено для 2018
Исходный ответ соответствовал тому, как поля даты в MongoDB были представлены как:
{"$date": 1506816000000}
Если вы хотите универсальное решение Python для сериализации datetime
в json, посмотрите ответ @jjmontes для быстрого решения, которое не требует никаких зависимостей.
Поскольку вы используете mongoengine (для комментариев), а pymongo является зависимостью, pymongo имеет встроенные утилиты, помогающие с сериализацией json:
http://api.mongodb.org/python/1.10.1/api/bson/json_util.html
Пример использования (сериализация):
from bson import json_util
import json
json.dumps(anObject, default=json_util.default)
Пример использования (десериализация):
json.loads(aJsonString, object_hook=json_util.object_hook)
Джанго
Джанго обеспечивает родной DjangoJSONEncoder
сериализатор, который правильно обрабатывает этот вид.
См. Https://docs.djangoproject.com/en/dev/topics/serialization/#djangojsonencoder.
from django.core.serializers.json import DjangoJSONEncoder
return json.dumps(
item,
sort_keys=True,
indent=1,
cls=DjangoJSONEncoder
)
Одно отличие, которое я заметил между DjangoJSONEncoder
и использованием кастомов default
вроде этого:
import datetime
import json
def default(o):
if isinstance(o, (datetime.date, datetime.datetime)):
return o.isoformat()
return json.dumps(
item,
sort_keys=True,
indent=1,
default=default
)
Это Django отбирает немного данных:
"last_login": "2018-08-03T10:51:42.990", # DjangoJSONEncoder
"last_login": "2018-08-03T10:51:42.990239", # default
Таким образом, в некоторых случаях вам может потребоваться быть осторожным с этим.