Python에서 JSON을 직렬화 할 때 "TypeError : (정수)를 JSON 직렬화 할 수 없습니다"?


162

파이썬에서 json 파일로 간단한 사전을 보내려고하는데 "TypeError : 1425 is 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

@ user1329894 올리기 솔루션 / 설명과 자기 주변 .. 등

실제로 버그를 재현하지 않는 최소의 재현을 작성하는 경우 -0입니다.
Russell Borogove

답변:


268

내 문제를 찾았습니다. 문제는 내 정수가 실제로 유형 numpy.int64이었습니다.


22
나는이 문제도 다루어야했고, 당신의 대답은 올바른 방향으로 나를 가리 켰습니다. 실제로 문제를 해결하는 데 도움이되는 다른 질문에 대한 링크 를 추가 하고 싶었습니다 .
JAC

19
JSON 직렬화 할 수없는 오류 메시지가 객체의 유형을 표시 할 수 있다면 좋을 것입니다 ...
Franck Dernoncourt

6
다음 은 커스텀 시리얼 라이저를 사용하는 깔끔한 솔루션입니다.
Owen

17
그것이 문제이지만 해결책은 무엇입니까?
BallpointBen

5
x.astype (int) 또는 int (x)
zelcon

50

파이썬 3에서 numpy.int64를 json 문자열로 덤프하는 데 문제가있는 것으로 보이며 파이썬 팀은 이미 그것에 대해 대화하고 있습니다. 자세한 내용은 여기를 참조 하십시오 .

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); 여기처럼
Pranzell

4

이것은 나를 위해 문제를 해결했습니다.

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

4

숫자를 int64(numpy에서) 로 변환하십시오 int.

예를 들어 variable x이 int64 인 경우 :

int(x)

int64의 배열 인 경우 :

map(int, x)

3

@JAC가 가장 높은 등급의 답변에 대한 의견에서 지적했듯이 일반 솔루션 (모든 numpy 유형에 대한)은 numpy dtypes를 원시 파이썬 유형으로 변환 스레드에서 찾을 수 있습니다 .

그럼에도 불구하고 필자의 경우에는이 답변과 다른 스레드의 답변을 결합하는 일반적인 솔루션이 필요했기 때문에 아래 버전의 솔루션을 추가 할 것입니다. 이것은 거의 모든 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)

다음이 저장 dataframeA의 json파일 :

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

도움이 되었기를 바랍니다



0

같은 문제입니다. List에 TypeError를 발생시키는 numpy.int64 유형의 숫자가 포함되어 있습니다. 나를위한 빠른 해결 방법은

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

리스트를 str ()로 변환하고 eval () 함수는 파이썬 표현식처럼“문자열”을 평가하고 결과를 정수 목록으로 반환합니다.


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.