2021.05.27  

【Python】 json.dumpsのエラー対処: object of type is not json serializable

Python    



Pythonで json.dumps を実行した際に発生する、次のエラーの対処法について紹介します。

  1. TypeError: Object of type set is not JSON serializable
  2. TypeError: Object of type datetime is not JSON serializable
  3. TypeError: dump() missing 1 required positional argument: 'fp'
  4. 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__」をオブジェクトに使用すると、

そのオブジェクトのアトリビュート(変数や配列などのメソッドではないもの)を辞書型にして返してくれます。マニュアル: 特殊属性

参考
https://qiita.com/kazetof/items/751be29f208836cf9bf4

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信