web-dev-qa-db-fra.com

datetime.datetime n'est pas sérialisable JSON

J'ai une classe en Python pour récupérer toutes les colonnes d'une table et retourner un JSON avec ces données.

Le problème est qu'au moins une de ces colonnes est une date/heure et je n'arrive pas à comprendre comment sérialiser les colonnes pour pouvoir générer un JSON valide.

Ma classe est la suivante:

class GetTodos(Resource):
    def get(self):
        con = cx_Oracle.connect('brunojs/[email protected]/orcl')
        cur = con.cursor()
        cur.execute("select * from organite_repository")
        r = [dict((cur.description[i][0], value) \
                for i, value in enumerate(row)) for row in cur.fetchall()]
        cur.connection.close()
        return (r[0] if r else None) if None else r 

Des allusions à ce sujet?

9
Bruno Fernandes

JSON n'a pas de type date/heure par défaut, c'est pourquoi Python ne peut pas le gérer automatiquement. Donc, vous devez transformer la date/heure en chaîne d'une manière ou d'une autre. Je pense que le meilleur moyen est d'écrire un gestionnaire personnalisé pour aider le module JSON.

import datetime
import json

def datetime_handler(x):
    if isinstance(x, datetime.datetime):
        return x.isoformat()
    raise TypeError("Unknown type")

json.dumps(data, default=datetime_handler)
24
Michael Mulqueen

Un moyen simple de le faire est de convertir vos données en string . De cette façon, vous pourrez dumper avec json.

>>> datetime.now()
datetime.datetime(2016, 3, 8, 11, 37, 24, 123639)

>>> str(datetime.now())
'2016-03-08 11:37:27.511053'

Mais vous pouvez également implémenter un sérialiseur pour transformer les données à votre guise.

2
feliperuhland