Zaktualizowano w 2018 r
Oryginalna odpowiedź uwzględniała sposób, w jaki pola „daty” MongoDB były reprezentowane jako:
{"$date": 1506816000000}
Jeśli potrzebujesz ogólnego rozwiązania Python do serializacji datetime
do json, sprawdź odpowiedź @jjmontes, aby znaleźć szybkie rozwiązanie, które nie wymaga żadnych zależności.
Ponieważ używasz mongoengine (na komentarze), a pymongo jest zależnością, pymongo ma wbudowane narzędzia do pomocy w serializacji json:
http://api.mongodb.org/python/1.10.1/api/bson/json_util.html
Przykładowe użycie (serializacja):
from bson import json_util
import json
json.dumps(anObject, default=json_util.default)
Przykładowe użycie (deserializacja):
json.loads(aJsonString, object_hook=json_util.object_hook)
Django
Django zapewnia natywny DjangoJSONEncoder
serializator, który poprawnie radzi sobie z tego rodzaju.
Zobacz 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
)
Zauważyłem jedną różnicę między DjangoJSONEncoder
używaniem niestandardowego default
typu takiego:
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
)
Czy Django usuwa trochę danych:
"last_login": "2018-08-03T10:51:42.990", # DjangoJSONEncoder
"last_login": "2018-08-03T10:51:42.990239", # default
W niektórych przypadkach może być konieczne zachowanie ostrożności.