Pythonで json.dumps を実行した際に発生する、次のエラーの対処法について紹介します。
- TypeError: Object of type set is not JSON serializable
- TypeError: Object of type datetime is not JSON serializable
- TypeError: dump() missing 1 required positional argument: 'fp'
- raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type クラス名 is not JSON serializable
前提知識
基本型(str、int、float、bool、None)については問題なくシリアライズ(json.dumps)することができます。
すなわち、次のコードの json.dumpsは正常に実行されます。
json_data = json.dumps({'one': 1, 'tow': 2.1, 'three': False, 'for': None})
マニュアル: JSON エンコーダおよびデコーダ
パターン1:set(集合型)を使用した場合
こちらは以下のパターンのエラーが発生した時の解決方法です。
TypeError: Object of type set is not JSON serializable
下記はエラーが発生したソースコードです。
import json
data = {"aaa", 2}
json_data = json.dumps(data)
理由は単純で、エラー文の通り「setオブジェクトはJSONにできないよ」という話です。
dict型にしたつもりが、set型になっていたというパターンです。
import json
data = {"aaa", 2} # 修正前
data = {"aaa": 2} # 修正後
json_data = json.dumps(data)
{ } をカンマ( , )で区切るとset型となり、コロン( : )で区切ると辞書型になります。
ぱっとみだとわからないので、「あれ?」っとなりますが、気がつけばすぐに解決するエラーです。
パターン2:datetime(時刻)を設定した場合
こちらは以下のパターンのエラーが発生した時の解決方法です。
TypeError: Object of type datetime is not JSON serializable
下記はエラーが発生したソースコードです。
import json
import datetime
dt_now = datetime.datetime.now()
data = {"aaa": dt_now}
json_data = json.dumps(data)
原因はdatetimeに対して、 json.dumpsは使えないというものです。
したがって、次のようにdatetimeを文字列型に変換すればエラーとなりません。
import json
import datetime
dt_now = str(datetime.datetime.now()) # datetimeを文字列に変換
data = {"aaa": dt_now}
json_data = json.dumps(data)
パターン3:構文が間違っているパターン
こちらは以下のパターンのエラーが発生した時の解決方法です。
TypeError: dump() missing 1 required positional argument: 'fp'
下記はエラーが発生したソースコードです。
json_data = json.dump({'one': 1, 'tow': 2.1, 'three': False, 'for': None})
こちらは「 json.dumps」とすべきところを「json.dump」と記述してしまっているせいで発生しているエラーです。
次のようにdumpの後ろにsをつければエラーとなりません。
json_data = json.dumps({'one': 1, 'tow': 2.1, 'three': False, 'for': None})
パターン4:インスタンスをjson.dumpsしているパターン
こちらは以下のパターンのエラーが発生した時の解決方法です。
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type data_class is not JSON serializable
下記はエラーが発生したソースコードです。
import json
class data_class(object):
def __init__(self):
self.x = 1
self.y = 2
data = data_class()
json_data = json.dumps(data)
インスタンスは通常、json.dumpsできないためエラーとなっています。
このインスタンスのデータをjson.dumpsしたい場合は、ソースコードの最終行を以下のように書き換えます。
json_data = json.dumps(data.__dict__)
print(json_data)
# {"x": 1, "y": 2}
特殊属性である「__dict__」をオブジェクトに使用すると、
そのオブジェクトのアトリビュート(変数や配列などのメソッドではないもの)を辞書型にして返してくれます。マニュアル: 特殊属性