Python에서 "TypeError: Object of type 'int64' is not JSON serializable" 오류 해결하기
Python - TypeError: Object of type 'int64' is not JSON serializable
Python에서 json
모듈을 사용하여 객체를 JSON으로 변환하려고 할 때 다음과 같은 오류가 발생할 수 있습니다.
TypeError: Object of type 'int64' is not JSON serializable
원인:
이 오류는 json
모듈이 특정 Python 데이터 유형을 JSON 형식으로 변환할 수 없기 때문에 발생합니다. 이 경우 문제의 데이터 유형은 int64
입니다. int64
는 NumPy에서 사용되는 정수 유형입니다.
해결 방법:
이 오류를 해결하려면 다음 두 가지 방법 중 하나를 사용할 수 있습니다.
데이터 유형 변환:
int64
데이터 유형을 JSON으로 변환 가능한 유형으로 변환합니다. 예를 들어, 다음과 같이 int
유형으로 변환할 수 있습니다.
import numpy as np
data = np.array([1, 2, 3], dtype=np.int64)
# int64 데이터를 int로 변환
data = data.astype(int)
# JSON으로 변환
json_data = json.dumps(data)
print(json_data)
출력:
[1, 2, 3]
커스텀 JSON 인코더 사용:
json
모듈의 기본 인코더를 대체하여 int64
데이터 유형을 처리하도록 하는 커스텀 인코더를 사용합니다. 다음은 예시입니다.
import json
import numpy as np
class NumpyEncoder(json.JSONEncoder):
def default(self, 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()
else:
return super().default(obj)
data = np.array([1, 2, 3], dtype=np.int64)
# 커스텀 인코더 사용
json_data = json.dumps(data, cls=NumpyEncoder)
print(json_data)
[1, 2, 3]
참고:
- NumPy 배열을 JSON으로 변환하려면
ndarray.tolist()
메서드를 사용하여 배열을 리스트로 변환할 수도 있습니다. - Pandas DataFrame을 JSON으로 변환하려면
to_json()
메서드를 사용할 수 있습니다.
예제 코드
예제 1:
import numpy as np
data = np.array([1, 2, 3], dtype=np.int64)
# JSON으로 변환하려고 하면 오류 발생
json_data = json.dumps(data)
TypeError: Object of type 'int64' is not JSON serializable
import numpy as np
data = np.array([1, 2, 3], dtype=np.int64)
# int64 데이터를 int로 변환
data = data.astype(int)
# JSON으로 변환
json_data = json.dumps(data)
print(json_data)
[1, 2, 3]
import json
import numpy as np
class NumpyEncoder(json.JSONEncoder):
def default(self, 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()
else:
return super().default(obj)
data = np.array([1, 2, 3], dtype=np.int64)
# 커스텀 인코더 사용
json_data = json.dumps(data, cls=NumpyEncoder)
print(json_data)
[1, 2, 3]
'TypeError: Object of type 'int64' is not JSON serializable' 오류 해결을 위한 대체 방법
NumPy 배열을 직접 JSON으로 변환하는 대신 np.save
및 np.load
함수를 사용하여 배열을 .npy 파일로 저장하고 로드할 수 있습니다.
import numpy as np
data = np.array([1, 2, 3], dtype=np.int64)
# 배열을 .npy 파일로 저장
np.save('data.npy', data)
# .npy 파일로부터 배열 로드
data = np.load('data.npy')
# JSON으로 변환
json_data = json.dumps(data.tolist())
print(json_data)
[1, 2, 3]
pickle 사용:
Python의 pickle
모듈을 사용하여 객체를 직렬화 및 역직렬화할 수 있습니다.
import pickle
data = np.array([1, 2, 3], dtype=np.int64)
# 객체 직렬화
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# 객체 역직렬화
with open('data.pkl', 'rb') as f:
data = pickle.load(f)
# JSON으로 변환
json_data = json.dumps(data.tolist())
print(json_data)
[1, 2, 3]
Pandas DataFrame 사용:
데이터가 Pandas DataFrame 형식인 경우 to_json()
메서드를 사용하여 직접 JSON으로 변환할 수 있습니다.
import pandas as pd
data = pd.DataFrame({'data': [1, 2, 3]})
# DataFrame을 JSON으로 변환
json_data = data.to_json()
print(json_data)
{"data":[1,2,3]}
다른 JSON 라이브러리 사용:
json
모듈 외에도 ujson
, orjson
등 다양한 JSON 라이브러리가 존재하며, 이 라이브러리들은 int64
와 같은 특정 데이터 유형을 처리하는 기능을 제공할 수 있습니다.
주의:
- 위의 대체 방법은 상황에 따라 적합하지 않을 수 있습니다. 예를 들어,
.npy
파일이나 pickle 파일을 다른 시스템에서 사용할 수 없거나, Pandas DataFrame을 사용하지 않는 경우 등. - 특정 상황에 맞는 해결 방법을 선택하기 위해서는 코드의 전체적인 맥락과 목표를 고려해야 합니다.
python numpy