[Python] TypeError: Object of type bytes is not JSON serializableの原因と解決方法

2022年5月7日土曜日

Python

Python「TypeError: Object of type bytes is not JSON serializable」のエラー原因と解決方法を紹介します。

アイキャッチ

結論

JSON serializableではないbytes型の変数をjson.dumpsしようとしているため発生しています。
JSON serializableな型に変換すると解決します。

JSON serializableな型であるかprint(type(変数名))で確認しましょう。
下記はエラー発生例です。

import json

sample = "sample"
bytes_sample = sample.encode("utf-8")
print(type(bytes_sample)) # <class 'bytes'>

data = json.dumps(bytes_sample) # TypeError: Object of type bytes is not JSON serializable 発生

よくある原因

HTTP Request

主にファイルアップロードなどでHTTP Requestする場合に発生するケース
下記のようにファイルをopenしstring型と誤認しjson.dumpsで発生

data = open("/content/sample_data/README.md", 'rb')
print(type(data.read())) # <class 'bytes'>

base64

base64関連を扱う際にbytes型、string型を誤認しjson.dumpsするケース
先ほどと同様HTTP Request時にやりがちです。

import base64

data = open("/content/sample_data/README.md", 'rb')

base64_data = base64.b64encode(data.read())
print(type(base64_data)) # <class 'bytes'>

base64_str = base64.b64decode(base64_data).decode('utf-8')
print(type(base64_str)) # <class 'str'>

JSON serializable

JSON serializableな型は以下の通り
詳細は公式ドキュメントを参照ください。

  1. 基本型(str, int, float, bool, None)
  2. dict
  3. list
  4. tuple

このため上記以外の型は、bytes型に限らず、
「TypeError: Object of type 型名 is not JSON serializable」でエラーが発生します。

AIで副業ならココから!

まずは無料会員登録

プロフィール

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

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


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology