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

コメント
@ppu-prof_Si
2024年1月28日19:44
Наша бригада искусных специалистов предоставлена предложить вам инновационные системы утепления, которые не только предоставят долговечную безопасность от прохлады, но и преподнесут вашему зданию трендовый вид.
Мы функционируем с современными строительными материалами, гарантируя прочный период использования и прекрасные результаты. Теплоизоляция облицовки – это не только экономия на обогреве, но и забота о природной среде. Энергоэффективные технологические решения, которые мы претворяем в жизнь, способствуют не только твоему, но и сохранению экосистемы.
Самое основное: <a href=https://ppu-prof.ru/>Отделка фасада с утеплением цена</a> у нас стартует всего от 1250 рублей за м2! Это доступное решение, которо
@ppu-prof_Si
2024年1月31日1:26
Наша бригада опытных специалистов находится в готовности выдвинуть вам актуальные приемы, которые не только гарантируют надежную протекцию от холода, но и дарят вашему коттеджу модный вид.
Мы деятельны с современными компонентами, обеспечивая долгосрочный срок работы и прекрасные итоги. Изолирование облицовки – это не только экономия энергии на обогреве, но и внимание о экосистеме. Энергоспасающие подходы, которые мы применяем, способствуют не только личному, но и сохранению природной среды.
Самое основополагающее: <a href=https://ppu-prof.ru/>Утепление стен дома снаружи цена</a> у нас составляет всего от 1250 рублей за м²! Это доступное решение, которое преобразит ваш домик в настоящий уютный местечко с неболь&
コメントする
コメント入力

名前 (※ 必須)

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

送信