PythonにてJsonを取り扱う際に発生する「Object of type 型名 is not JSON serializable」の原因と解決方法を紹介します。
結論
まず、出力されたエラーの内容を見てみましょう。
「Object of type 型名 is not JSON serializable」は、「この型名のオブジェクトはJsonシリアライズできません」という意味です。
公式ドキュメントにも記載がありますが、
json.dumpsが可能な型は基本型(str, int, float, bool, None)とdict, list, tupleのみです。
「Object of type 型名 is not JSON serializable」が発生する原因は基本型(str, int, float, bool, None)とdict, list, tuple以外をjson.dumpsしていることが原因です。
このエラーが発生するサンプルプログラムを見てみます。
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しようとしているためエラーが発生します。
よくある原因と回避策
datetime型をjson.dumps
先ほど例示したパターンです。
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"}
# json.dumps不可能
ng_object = {'datetime': datetime.datetime.now()}
print(json.dumps(ng_object)) # TypeError: Object of type 'datetime' is not JSON serializable
set型をjson.dumps
set型をjson.dumpsしている場合に発生するエラーです。
dict型と間違えている場合があるので注意が必要です。
set型の場合はdict型に変換することで回避可能です。
import json
# json.dumps可能
sample_dict = {'aaa': 1} # dict型
print(json.dumps(sample_dict)) # {"aaa": 1}
# json.dumps不可能
sample_set = {'aaa', 1} # set型
print(json.dumps(sample_set)) # TypeError: Object of type 'set' is not JSON serializable
クラスをjson.dumps
独自定義したクラスをjson.dumpsしている場合に発生するエラーです。
クラスそのものではなく、__dict__を利用してクラスのプロパティをjson.dumpsすることで回避できます。
import json
class sample_class():
def __init__(self):
self.value_a = 1
self.value_b = 'sample'
sample_class = sample_class()
# json.dumps可能
print(json.dumps(sample_class.__dict__)) # {"value_a": 1, "value_b": "sample"}
# json.dumps不可能
print(json.dumps(sample_class)) # TypeError: Object of type 'sample_class' is not JSON serializable
エラーが発生したときのチェックポイント
-
基本型(str, int, float, bool, None)とdict, list, tuple以外をjson.dumpsしていないか?
-
dictのvalueなど、dict, list, tupleは基本型で構成されているか?
-
クラスのインスタンスをそのままjson.dumpsしていないか?
0 件のコメント :
コメントを投稿