Pourquoi la sérialisation json de datetime objets en python ne pas fonctionner hors de la boîte pour objets datetime
Pourquoi la sérialisation json fonctionne pas pour les objets datetime . Comme je comprends la sérialisation json l'idée de base pour n'importe quel objet peut appeler la __str__
builtin la fonction, puis urlencode l'objet que vous obtenez une réponse. Mais dans le cas de datetime j'obtiens l'erreur suivante
TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable
bien qu'il y est un __str__
je.e un moyen de stringifying l'objet est déjà disponible , Mais il semble comme une décision consciente de ne pas le faire , pourquoi serait-ce le cas?
- Vous êtes mal à comprendre comment json œuvres. Il n'a rien à voir avec le str méthode. JSON n'a pas de date-type de temps, période, il est donc impossible de sans perte d'encoder une date-heure en JSON, sans une quelconque logique sur l'extrémité de réception. Ainsi, la bibliothèque (logiquement) fait de vous le faire vous-même par la conversion d'un timestamp Unix ou ISO chaîne de date ou quelque chose et de le rendre plus explicite le fait que la conversion est nécessaire.
- C'est tout sauf logique. Il est possible sans perte de coder un datetime pour un string ou int, et de nombreux cas d'utilisation que l'appel à la conversion à partir de dict, json, dict à nouveau ne jamais laisser le python de l'écosystème, mais le json module ne peut pas gérer ce cas sans personnalisé datetime gestionnaire? Vraiment?! En regardant le grand nombre de stackoverflow questions sur le sujet, je dirais que je ne suis pas seul dans mon incrédulité.
Vous devez vous connecter pour publier un commentaire.
Non, il ne fonctionne pas de cette façon dans
json
module. Le module vous offre un défaut codeur:json.JSONEncoder
. Vous avez besoin de l'étendre à fournir à votre mise en œuvre dedefault
méthode pour sérialiser des objets. Quelque chose comme ceci:Comme d'autres l'a souligné à juste titre, la raison en est que la standard pour json ne précise pas combien de temps date peut être représenté.
isinstance
vérifier partie deif isinstance (obj, datetime.datetime): return obj.strftime ('%Y/%m/%d/%H/%M/%S') elif isinstance (obj, datetime.date): return obj.strftime ('%Y/%m/%d')
..isoformat()
à la fin.Comment aimeriez-vous pour être sérialisé?
JSON ne précisent pas comment gérer les dates, de sorte que le python
json
la bibliothèque ne peut pas prendre la décision sur la manière de représenter ces pour vous. Qui dépend entièrement de la façon dont l'autre côté (navigateur, script, peu importe) gère les dates en JSON ainsi.Un moyen simple de patcher le json module, telle que la sérialisation serait en charge de datetime.
Que d'utiliser la sérialisation json comme vous le faites toujours, cette fois avec datetime être sérialisé en tant que isoformat.
Résultant en: '{"créé": "2015-08-26T14:21:31.853855"}'
Voir plus de détails et quelques mots de prudence à:
StackOverflow: JSON datetime entre Python et JavaScript
Si vous souhaitez obtenir de codage et de décodage de datetimes sans avoir à la mettre en œuvre, vous pouvez utiliser json_tricks, qui est un wrapper qui ajoute de codage et de décodage pour les différents types populaires. Il suffit de l'installer:
puis les importer à partir de
json_tricks
au lieu dejson
, par exemple:Avertissement: il est fait par moi. Parce que j'ai eu le même problème.
Si vous voulez automatiquement sérialiser tout ce qui peut être stringified, vous pouvez le faire avec juste la norme de mise en œuvre très facilement:
Mais notez que cela a des inconvénients, par exemple, rien de tout cela va être désérialisée sans effort supplémentaire, et peut-être parfois, vous ne voulez pas sérialiser quelque chose (comme une fonction d'un grand tableau numpy), mais un avertissement s'affiche à la place, qui cette méthode silence.