TypeError: Object of type ndarray is not JSON serializable の対処
結論を先に。このエラーは、numpyの配列(ndarray)や np.int64・np.float32 といった型を、そのまま json.dumps に渡したために起きます。JSONはPythonの標準型しか扱えないので、配列は .tolist()、スカラーは int()/float() で変換してから渡します。
TypeError: Object of type ndarray is not JSON serializable原因
json モジュールが直接シリアライズできるのは、dict・list・str・int・float・bool・None などの標準型だけです。numpyの ndarray や numpy独自の数値型はこれに含まれないため、変換されずにエラーになります。
対処
- 配列は .tolist() でPythonのリストに変換します。
import json, numpy as nparr = np.array([1, 2, 3])json.dumps({"data": arr.tolist()})- スカラー(np.int64 など)は Python の int/float に直します。
value = np.float32(3.14)json.dumps({"v": float(value)})- 変換対象が多いときは、default にカスタム関数を渡してまとめて処理します。
def conv(o): if isinstance(o, np.ndarray): return o.tolist() if isinstance(o, np.integer): return int(o) if isinstance(o, np.floating): return float(o) raise TypeError(o)json.dumps(obj, default=conv)まとめ
- 原因は numpy の型が JSON 標準型でないこと
- 配列は .tolist()、スカラーは int()/float()
- 数が多ければ json.dumps の default にカスタム変換を渡す
- APIやファイル出力の前に numpy 型を標準型へ寄せておく