Pandas dataframe 또는 Numpy를 사용해서 JSON으로 출력하는 경우 발생하는 에러입니다. Pandas dataframe의 value list는 numpy를 사용하고 있고, Numpy의 data type은 Python에서 정의하고 있는 data type보다 많기 때문에 표준 Python data type만 처리하는 Json encoder에서 에러가 발생합니다. 이러한 문제점을 수정하기 위해서 custom json encoder를 정의하거나, numpyencoder를 설치해서 사용할 수 있습니다. Custome Json encoder 코드는 GitHub 링크를 확인해주세요.
에러 메시지:
File "dataframe_to_json_test.py", line 22, in test
print (json.dumps(dict_temp))
File "/usr/lib/python3.8/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python3.8/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.8/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python3.8/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type int64 is not JSON serializable
수정 방법:
- 터미널에서 $ pip3 install numpyencoder 설치
- json.dumps() 또는 encoder 함수 호출 시 cls= NumpyEncoder 파라미터 추가
Example Code #1:
from numpyencoder import NumpyEncoder
import pandas as pd
import numpy as np
import json
def test1():
data = {'A':[1, 2, 3], 'B':[4, 5, 6], 'C':[7, 8, 9] }
df = pd.DataFrame(data)
→ df 값 확인 (Column이 A, B, C)
dict_temp = dict()
dict_temp['SUM'] = df['A'].sum()
print (json.dumps(dict_temp))
→에러 출력 TypeError: Object of type int64 is not JSON serializable
print (json.dumps(dict_temp, cls= NumpyEncoder, indent=4, ensure_ascii=False))
→ 정상 출력
Example Code #2:
def test2():
numpy_data = np.array([0, 1, 2, 3])
print (type(numpy_data[0]))
→ <class 'numpy.int64'>
print (json.dumps(numpy_data, cls= NumpyEncoder))
→ 정상 동작
print (json.dumps(numpy_data))
→ 에러 발생
NumpyEncoder code: (출처: numpyencoder)
import json
import numpy as np
class NumpyEncoder(json.JSONEncoder):
""" Custom encoder for numpy data types """
def default(self, obj):
if isinstance(obj, (np.int_, np.intc, np.intp, np.int8,
np.int16, np.int32, np.int64, np.uint8,
np.uint16, np.uint32, np.uint64)):
return int(obj)
elif isinstance(obj, (np.float_, np.float16, np.float32, np.float64)):
return float(obj)
elif isinstance(obj, (np.complex_, np.complex64, np.complex128)):
return {'real': obj.real, 'imag': obj.imag}
elif isinstance(obj, (np.ndarray,)):
return obj.tolist()
elif isinstance(obj, (np.bool_)):
return bool(obj)
elif isinstance(obj, (np.void)):
return None
return json.JSONEncoder.default(self, obj)
if __name__ == '__main__':
numpy_encoder = NumpyEncoder()
관련 글:
[SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법
[SW 개발/REST API] - 자주 사용하는 curl 명령어 옵션과 예제
[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - MariaDB의 Python Connector 설치와 사용 방법
[개발환경/git] - GitHub 아이디/패스워드 입력 없이 사용하는 방법
[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - MariaDB 또는 MySQL에서 사용하는 Data type 정리
[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Jupyter Notebook의 업그레이드: Jupyter Lab 설치 및 extension 사용법
[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - CSV 파일에서 MariaDB(또는 MySQL)로 데이터 가져오는 방법
[SW 개발/Python] - Python JSON 사용 시 TypeError: Object of type bytes is not JSON serializable
댓글