JSON 만들 때 ECMAScript 표준 으로 NaN 처리하기
최근에 회사에서 Go 서버에서 처리하던 데이터 분석을 Python 서버로 이전하는 작업을 진행했다.
- 성능 문제: 대규모 데이터셋에서 PDF 계산을 하는데 Go에서 너무 오래 걸렸기 때문에 (표면적 계산 때문).
- 코드 유지보수: Go 서버의 데이터 분석 코드는 너무 복잡하고 비효율적이라, Python으로 전환하는 것이 더 나았기 때문. 심지어는 Go 서버에서 Python을 cmd 로 실행한 후 print 된 결과값을 그대로 가져오는 경우가 있었음
Python은 데이터 분석에 있어 압도적으로 더 좋은 개발 환경을 제공하는건 누구나 알기때문에, 유지보수 및 미래의 기능추가를 고려했을 때 이걸 Python Engine파트 쪽으로 기능을 옮기기로했다. 옮기는 내용에 대해서는 다른글에서 다뤄보도록 하고자 한다.
JSON에서 NaN 처리
문제는, Python Engine에서 저장한 JSON파일을 Go 서버에서 프론트로 그대로 보내는 과정에서, application/json
으로 설정했음에도 불구하고 간혹 전체 내용이 문자열로 처리되는 경우가 있었다. 원인을 조사해보니 NaN 값이 문제였다. NaN은 ECMAScript 표준에서 유효한 데이터형이 아니기 때문에, 이를 적절히 처리하지 않으면 JSON으로 직렬화할 때 문제가 발생합니다 라고는 하는데 오류가 나는것이 아닌 그냥 raw string 값으로 값이 저장되는게 신기했다.
NaN을 null로 변환하기
이 문제를 해결하기 위해, Pandas DataFrame에서 NaN 값을 처리하는 방법을 찾아봤는데 DataFrame을 to_dict()
로 바로 변환하면 NaN 값이 그대로 json 데이터에 들어가게 되지만, to_json()
을 사용하면 NaN 값이 자동으로 null
로 변환된다고 한다. 이렇게 변환된 데이터를 json.loads()
로 다시 Python 딕셔너리로 변환하면 완성.
json_data : str = df.to_json()
clean_df_as_dict : dict = json.loads(json_data)
# json.dumps....