[Python] dateやdatetimeをjson.dumpでエラーなく出力する
こんにちは、@yoheiMuneです。
Pythonのjsonモジュールを使うといい感じにjsonが扱えますが、dateやdatetimeなどのJSONに定義されていない型は、はうまく文字列に変換できません。今日はその対応Tipsをブログに書きたいと思います。
最後になりますが本ブログでは、Python・フロントエンド・Go言語・Linux・Node.js・インフラ・開発関連・Swift・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!
Pythonのjsonモジュールを使うといい感じにjsonが扱えますが、dateやdatetimeなどのJSONに定義されていない型は、はうまく文字列に変換できません。今日はその対応Tipsをブログに書きたいと思います。
目次
json.dumpで、dateやdatetimeはエラーになる
こんな感じにエラーになってしまいます。import json from datetime import datetime # datetime型を含むdict item = { "dt" : datetime.now() } # JSON文字列にしようとするとエラー jsonstr = json.dumps(item) """ Traceback (most recent call last): File "<stdin>", line 2, in <module> File "/Users/munesadayohei/.pyenv/versions/python3.6/json/__init__.py", line 231, in dumps return _default_encoder.encode(obj) File "/Users/munesadayohei/.pyenv/versions/python3.6/json/encoder.py", line 199, in encode chunks = self.iterencode(o, _one_shot=True) File "/Users/munesadayohei/.pyenv/versions/python3.6/json/encoder.py", line 257, in iterencode return _iterencode(o, 0) File "/Users/munesadayohei/.pyenv/versions/python3.6/json/encoder.py", line 180, in default o.__class__.__name__) TypeError: Object of type 'datetime' is not JSON serializable """これはJSONに日付(date/datetime)の型が定義されていないことが原因で、そのためjsonモジュールはどのように出力すれば良いのかわからず、エラーとなってしまいます。このエラーに対応する方法です。
default指定を利用して、JSON対象外の型もJSON文字列化できるようにする
JSONシリアライズがデフォルトではできないものについて、default
引数で変換方法を指定することで、JSON文字列として出力することができます。import json from datetime import date, datetime # date, datetimeの変換関数 def json_serial(obj): # 日付型の場合には、文字列に変換します if isinstance(obj, (datetime, date)): return obj.isoformat() # 上記以外はサポート対象外. raise TypeError ("Type %s not serializable" % type(obj)) # datetime型を含むdict item = { "dt" : datetime.now() } # default引数を指定して、JSON文字列を生成します jsonstr = json.dumps(item, default=json_serial) print(jsonstr) # '{"dt": "2017-07-05T17:01:06.112224"}'今回はdatetimeやdateの対応方法でしたが、この方法を用いればそれら以外にも対応が可能ですね。
最後に
Pythonは細かいところで今回のようなTipsもありますが、それでもやっぱり色々と便利ですね〜。今後もPythonについて色々とブログを書きたいと思います。最後になりますが本ブログでは、Python・フロントエンド・Go言語・Linux・Node.js・インフラ・開発関連・Swift・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!