PythonでJSONをシリアル化するときに、「TypeError:(Integer)is not JSON serializable」


162

単純な辞書をPythonからjsonファイルに送信しようとしていますが、「TypeError:1425 is not JSON serializable」というメッセージが表示され続けます。

import json
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
afile = open('test.json','w')
afile.write(json.dumps(alerts,encoding='UTF-8'))
afile.close()

デフォルトの引数を追加すると、書き込みが行われますが、整数値はjsonファイルに文字列として書き込まれるため、望ましくありません。

afile.write(json.dumps(alerts,encoding='UTF-8',default=str))


1
これはその質問を「複製」していないようです..

8
問題が見つかりました。問題は、私の整数が実際にはnumpy.int64型であるということでした。
user1329894 2012

@ user1329894解決策/説明として投稿し、自動的に閉じる..

-0は、実際にはバグを再現しない最小限の再現を記述します。
ラッセルボロゴーブ2012

回答:


268

問題が見つかりました。問題は、整数が実際に型であるということnumpy.int64でした。


22
私もこの問題に対処する必要があり、あなたの答えは私を正しい方向に向けました。問題を実際に解決するのに役立つ別の質問へのリンクを追加たかっただけです。
JAC、

19
JSON unserializableエラーメッセージが...オブジェクトの種類を表示することができればそれは素晴らしいことだ
フランクDernoncourt

6
ここでは、カスタム・シリアライザを使用してきちんとしたソリューションです。
オーウェン

17
それが問題ですが、解決策は何ですか?
BallpointBen 2018年

5
x.astype(int)またはint(x)
zelcon

50

Python 3でnumpy.int64をjson文字列にダンプする問題があるようで、Pythonチームはすでにそれについて話し合っています。詳細については、こちらをご覧ください

Serhiy Storchakaが提供する回避策があります。それは非常にうまく機能するので、ここに貼り付けます:

def convert(o):
    if isinstance(o, numpy.int64): return int(o)  
    raise TypeError

json.dumps({'value': numpy.int64(42)}, default=convert)

Serhiyによるすばらしい回避策。彼のアプローチを確認してください。追加するには、次のようにします。json.dumps(yourObject、default = default); ここのような。
プランツェル、



3

@JACが最高評価の回答のコメントで指摘したように、(すべてのnumpyタイプの)一般的な解決策は、numpy dtypesをネイティブPythonタイプに変換するスレッドで見つけることができ ます

それでも、私の場合、これらの回答と他のスレッドの回答を組み合わせた一般的なソリューションが必要だったので、以下のバージョンのソリューションを追加します。これはほとんどすべてのnumpyタイプで動作するはずです。

def convert(o):
    if isinstance(o, np.generic): return o.item()  
    raise TypeError

json.dumps({'value': numpy.int64(42)}, default=convert)

確かにいい答え
jtlz2

2

これは応答が遅いかもしれませんが、最近同じエラーが発生しました。たくさんサーフィンした後、この解決策は私を助けました。

alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
def myconverter(obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, datetime.datetime):
            return obj.__str__()

通話myconverter中にjson.dumps()以下のように。json.dumps(alerts, default=myconverter).


1

または、最初にオブジェクトをデータフレームに変換することもできます。

df = pd.DataFrame(obj)

次に、これdataframejsonファイルに保存します。

df.to_json(path_or_buf='df.json')

お役に立てれば



0

同じ問題。リストには、TypeErrorをスローするタイプnumpy.int64の数が含まれています。私のための簡単な回避策は

mylist = eval(str(mylist_of_integers))
json.dumps({'mylist': mylist})

リストをstr()およびeval()関数に変換すると、Python式のように「文字列」が評価され、結果は整数のリストとして返されます。


eval(str())は非常に遅いので、注意して使用してください。@shivaの答えははるかに優れています:json.dumps(alerts、default = myconverter)
user319436

0

使用する

from numpyencoder import NumpyEncoder

Python3でこの問題を解決するには:

import json
from numpyencoder import NumpyEncoder
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 
15:30']}
afile = open('test.json','w')
afile.write(json.dumps(alerts,encoding='UTF-8',cls=NumpyEncoder))
afile.close()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.