54 votes

Pourquoi la sérialisation json d'objets de type date en python ne fonctionne pas d'emblée pour les objets de type date

Pourquoi la sérialisation json ne fonctionne pas pour les objets datetime . Si je comprends bien la sérialisation json, l'idée de base pour n'importe quel objet est d'appeler la fonction __str__ et ensuite coder en url l'objet que vous obtenez comme réponse. Mais dans le cas de datetime je reçois l'erreur suivante

TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable

alors qu'il existe un __str__ c'est à dire une manière de stringifier l'objet déjà disponible, mais il semble que ce soit une décision consciente de ne pas le faire, pourquoi serait-ce le cas ?

92voto

Vikas Points 3756

Non, ça ne marche pas comme ça dans json module. Le module vous fournit un encodeur par défaut : json.JSONEncoder . Vous devez l'étendre afin de fournir votre implémentation de la fonction default pour sérialiser les objets. Quelque chose comme ça :

import json
import datetime
from time import mktime

class MyEncoder(json.JSONEncoder):

    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return int(mktime(obj.timetuple()))

        return json.JSONEncoder.default(self, obj)

print json.dumps(obj, cls = MyEncoder)

Comme d'autres l'ont fait remarquer à juste titre, la raison en est que les norme pour json ne précise pas comment la date et l'heure peuvent être représentées.

10voto

Martijn Pieters Points 271458

Comment voulez-vous qu'ils soient sérialisés ?

JSON ne spécifie pas comment gérer les dates, donc la méthode python json La bibliothèque ne peut pas prendre la décision sur la manière de les représenter pour vous. Cela dépend complètement de la façon dont l'autre partie (navigateur, script, peu importe) traite les dates dans JSON également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X