[Python] 「Object of type 型名 is not JSON serializable」の原因と解決方法

2022年1月9日日曜日

Python

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

エラーが発生したときのチェックポイント

  1. 基本型(str, int, float, bool, None)とdict, list, tuple以外をjson.dumpsしていないか?
  2. dictのvalueなど、dict, list, tupleは基本型で構成されているか?
  3. クラスのインスタンスをそのままjson.dumpsしていないか?

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology