web-dev-qa-db-ja.com

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

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))
133
user1329894

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

238
user1329894

Numpy.int64をPython 3の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)
26
hsc

これで問題が解決しました:

def serialize(self):
    return {
        my_int: int(self.my_int), 
        my_float: float(self.my_float)
    }
3
Tobias Ernst

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

df = pd.DataFrame(obj)

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

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

お役に立てれば

1
kartik

数値をint64(numpyから)からintに変換するだけです。

たとえば、変数xがint64の場合:

int(x)

がint64の配列の場合:

map(int, x)

Numpyデータ型があり、通常のint()またはfloat()データ型に変更するだけです。それは正常に動作します。