본문 바로가기
SW 개발/Data 분석 (RDB, NoSQL, Dataframe)

Dataframe(또는 Numpy)를 JSON 출력 시 에러: TypeError: Object of type int64 is not JSON serializable

by Kibua20 2021. 6. 20.

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

          에러 발생

Dataframe (Numpy)를 Json으로 변환 시 에러

 

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)] - Python Selenium과 BeautifulSoup을 활용하여 Google PlayStore 리뷰 가져오기

[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




댓글