Aktualisiert für 2018
Die ursprüngliche Antwort wurde so angepasst, dass die MongoDB "date" Felder wie folgt dargestellt wurden:
{"$date": 1506816000000}
Wenn Sie eine generische Python-Lösung für die Serialisierung von datetime
zu json möchten, schauen Sie sich @jjmontes' Antwort für eine schnelle Lösung an, die keine Abhängigkeiten erfordert.
Da Sie mongoengine verwenden (wie in den Kommentaren erwähnt) und pymongo eine Abhängigkeit ist, bietet pymongo eingebaute Hilfsprogramme zur Unterstützung der json-Serialisierung:
http://api.mongodb.org/python/1.10.1/api/bson/json_util.html
Beispielverwendung (Serialisierung):
from bson import json_util
import json
json.dumps(anObject, default=json_util.default)
Beispielverwendung (Deserialisierung):
json.loads(aJsonString, object_hook=json_util.object_hook)
Django
Django bietet einen nativen DjangoJSONEncoder
-Serializer, der mit dieser Art von Daten ordnungsgemäß umgeht.
Siehe 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
)
Ein Unterschied, den ich zwischen DjangoJSONEncoder
und der Verwendung eines benutzerdefinierten default
wie folgt festgestellt habe:
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
)
Ist, dass Django einen Teil der Daten entfernt:
"last_login": "2018-08-03T10:51:42.990", # DjangoJSONEncoder
"last_login": "2018-08-03T10:51:42.990239", # default
Daher müssen Sie in einigen Fällen darauf achten.