Mise à jour pour 2018
La réponse initiale tenait compte de la façon dont les champs "date" de MongoDB étaient représentés :
{"$date": 1506816000000}
Si vous souhaitez une solution Python générique pour la sérialisation des données datetime
en json, consultez La réponse de @jjmontes pour une solution rapide qui ne nécessite aucune dépendance.
Comme vous utilisez mongoengine (selon les commentaires) et que pymongo est une dépendance, pymongo a des utilitaires intégrés pour aider à la sérialisation json :
http://api.mongodb.org/python/1.10.1/api/bson/json_util.html
Exemple d'utilisation (sérialisation) :
from bson import json_util
import json
json.dumps(anObject, default=json_util.default)
Exemple d'utilisation (désérialisation) :
json.loads(aJsonString, object_hook=json_util.object_hook)
Django
Django fournit une fonction native DjangoJSONEncoder
sérialiseur qui traite ce genre de choses correctement.
Voir 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
)
Une différence que j'ai remarqué entre DjangoJSONEncoder
et l'utilisation d'un default
comme ça :
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
)
C'est que Django enlève un peu de données :
"last_login": "2018-08-03T10:51:42.990", # DjangoJSONEncoder
"last_login": "2018-08-03T10:51:42.990239", # default
Il faut donc faire attention à cela dans certains cas.
1 votes
S'agit-il spécifiquement de python en général, ou éventuellement de django ?
2 votes
Techniquement, c'est spécifiquement python, je n'utilise pas django, mais je récupère des enregistrements à partir de mongodb.
0 votes
Duplication possible de JSON datetime entre Python et JavaScript
0 votes
J'utilise mongoengine, mais si pymongo a de meilleurs moyens de contourner ou de surmonter ce problème, merci de le dire.
0 votes
@jdi La réponse que vous avez liée en double ne me semble pas avoir de sens. Si vous pouvez publier ici une réponse qui aurait un sens dans mon contexte, ce serait plus utile.
0 votes
La copie que j'ai postée est la manière générique de traiter ce problème, où vous spécifiez le paramètre supplémentaire à l'adresse suivante
JSON
en tant que gestionnaire. J'ai posté une réponse spécifique à pymongo.3 votes
La question liée vous demande essentiellement de ne pas essayer de sérialiser l'objet datetime, mais plutôt de le convertir en une chaîne au format ISO commun avant de le sérialiser.
0 votes
Pour une solution générique qui gère plus que juste
datetime.datetime
voir Rendre un objet JSON sérialisable avec un encodeur régulier .0 votes
Impossible d'importer le nom json_util
0 votes
Si vous avez la possibilité de stocker la date sous la forme d'un flottant (secondes depuis l'époque, comme dans le cas de
time.time()
) qui est portable et vous pouvez appelerdatetime.datetime.fromtimestamp
quand vous avez besoin d'un pythondatetime
.