「object of type is not json serializable」により Python で JSON 出力できない時の原因と対処法

「object of type is not json serializable」により Python で JSON 出力できない時の原因と対処法Python
ゆうすけ
ゆうすけ

json.dump() を実行すると

‘object of type is not json serializable’ という Error が発生します…

資格マフィア
資格マフィア

主な原因と対処法を説明しよう。

 

✔️ 本記事のテーマ

‘object of type is not json serializable’の原因と対処法

 

‘object of type is not json serializable’ が発生する原因

この Error が発生する場面の多くは python で dict を json 出力するときでしょう。

with open('./output.json', 'w') as f:
    json.dump(sapmle_dict, f)

 

この Error が発生する原因は

「変換対象の dict の値に オブジェクトがセットされている」

からです。

 

つまり、以下のような dict をそのまま json.dump() に渡したとき、

json.dump() がオブジェクトを解釈できず Error が発生します。

import json


class Sample():
    def __init__(self):
        self.x = 1
        self.y = 2


sample_dict = {
    'object_id': 1,
    'object': Sample()
}

with open('./output.json', 'w') as f:
    json.dump(sample_dict, f)

‘object of type is not json serializable’ の対処法 その1

‘object of type is not json serializable’ が発生したとき

多くは date や datetime オブジェクトを値にセットしていることが多いと思います。

そのような場合は str に変換することで解決するでしょう。 

import json
from datetime import date


today = date.today()

sample_dict = {
    'object_id': 1,
    'date': today.strftime('%Y/%m/%d')
}

with open('./output.json', 'w') as f:
    json.dump(sample_dict, f)

▼ output.json

{
  "object_id": 1, 
  "date": "2022/06/29"
}

‘object of type is not json serializable’ の対処法 その2

date オブジェクト以外のオブジェクトを値にセットして

‘object of type is not json serializable’ が発生したときは

以下のように値にセットするときにオブジェクトに .__dict__ を付与してあげることで解決します。

import json


class Sample():
    def __init__(self):
        self.x = 1
        self.y = 2


sample_dict = {
    'object_id': 1,
    'object': Sample().__dict__
}

with open('./output.json', 'w') as f:
    json.dump(sample_dict, f)

▼ output.json

{
  "object_id": 1, 
  "object": {
    "x": 1,
    "y": 2
  }
}

‘object of type is not json serializable’ の対処法 その3

その2 で解説した .__dict__ は値をセットするときに効かせる必要があります。

また、 .__dict__ は再帰的には作用しません。

そのため

  1. 既に作成した dict を出力したい
  2. 入れ子にオブジェクトを格納した dict を出力したい

といった場合には上手く作用しません。

 

そのような場合は json.dump() の引数 default を使用しましょう。

import json


class Sample():
    def __init__(self):
        self.x = 1
        self.y = 2
        self.z = SampleNest()


class SampleNest():
    def __init__(self):
        self.a = 'a'
        self.b = 'b'


sample_dict = {
    'object_id': 1,
    'object': Sample()
}


def func(obj):
    return obj.__dict__


with open('./output.json', 'w') as f:
    json.dump(sample_dict, f, default=func)

▼ output.json

{
  "object_id": 1, 
  "object": {
    "x": 1, 
    "y": 2,
    "z": {
      "a": "a",
      "b": "b"
    }
  }
}

 

default によって json.dump() 実行時に

オブジェクトが解釈できなかった場合の動作を指定することができます。

 

上記コードの場合だと

オブジェクトを解釈できなかった場合に obj.__dict__ を効かせるような実装になっています。

エンジニアとしての自身の価値をチェックする(完全無料)

エンジニアとして、

自分の価値がどれくらいのものかご存知でしょうか?

 

エンジニアとしてIT業界に身を置いていると

今の会社でずっと働くのか、フリーランスとして独立するのか …

と様々な選択肢があります。

 

どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも

自身の価値を知っておくことはとても重要です。

 

TechClips ME では、

職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。

▼▼▼▼▼

▲▲▲▲▲

しかもTechClips MEでは想定年収を企業から提示してくれるので、

自身の価値を数字で分かりやすくたしかめることができます。

 

登録はもちろん完全無料なので、一度登録してみると良いかもしれません。

 

コメント

タイトルとURLをコピーしました