2016-03-08 29 views
7

私はPythonでテーブル内のすべてのカラムを取得し、このデータを含むJSONを返すクラスを持っています。datetime.datetimeはJSONシリアライズ可能ではありません

問題は、これらの列の少なくとも1つがdatetimeであり、有効なJSONを生成できるように列をシリアル化する方法を理解できないようです。この上

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 

任意のヒントを次のように

私のクラスはありますか?

答えて

19

JSONにはデフォルトのdatetime型がありません。そのため、Pythonでは自動的に処理できません。したがって、datetimeを文字列にする必要があります。私は最良の方法は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) 
+0

私はこれを 'raise x'で更新しました。 –

+0

毎回 'default = datetime_handler'を使わずにdatetimeを自動的に解析するには' json.JSONEncoder.default = datetime_handler'を使います。 – ChaimG

+0

datetime_handlerが1つの引数を受け取りますが、JSONがそれを手に入れようとしているというTypeErrorを取得しました。 – user1917407

3

簡単な方法は、データを文字列にキャストすることです。 そうすれば、あなたはjsonでダンプすることができます。

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

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

しかし、シリアライザを実装して、必要に応じてデータを変換することもできます。

関連する問題