PythonでJSONを扱う際、特定のオブジェクトタイプをシリアライズできないというエラー「object of type is not json serializable」が発生することがあります。この記事では、その原因と対処法について説明します。
原因
このエラーは、Pythonのjson.dump()
またはjson.dumps()
関数を使用して、シリアライズできないオブジェクトタイプ(例えば、独自のクラスやdatetime
オブジェクト)をJSONに変換しようとしたときに発生します。
import json
import datetime
# json.dumps可能
ok_object = ['aaa', {'bbb': ('ccc', None, 1.0, 2)}]
print(json.dumps(ok_object)) # ["aaa", {"bbb": ["ccc", null, 1.0, 2]}]
# json.dumps不可能
ng_object = {'datetime': datetime.datetime.now()}
print(json.dumps(ng_object)) # TypeError: Object of type 'datetime' is not JSON serializable
上記のコードでは、datetime
オブジェクトを含む辞書をjson.dumps()
に渡しています。その結果、「TypeError: Object of type ‘datetime’ is not JSON serializable」というエラーが発生します。
対処法
datetimeオブジェクトの場合
datetime
オブジェクトをシリアライズするには、オブジェクトを文字列に変換します。
import json
import datetime
# json.dumps可能
ok_object = {'datetime': datetime.datetime.now().isoformat()} # datatime型をstr型に変換
print(json.dumps(ok_object)) # {"datetime": "2021-09-18T13:49:18.776939"}
独自クラスの場合
独自に定義したクラスのインスタンスをシリアライズするには、__dict__
メソッドを使用してクラスのプロパティを辞書に変換します。
import json
class Sample():
def __init__(self):
self.x = 1
self.y = 2
sample = Sample()
# json.dumps可能
print(json.dumps(sample.__dict__)) # {"x": 1, "y": 2}
以上、Pythonで「object of type is not json serializable」エラーに遭遇したときの対処法について説明しました。この情報が皆さんの問題解決に役立つことを願っています。