JSON 으로 데이터를 표현하는 것은 굉장히 일반화 되어 있습니다. 많은 API 의 응답이 JSON 형태를 가지고 있을 뿐만 아니라 서버의 설정이나 개발된 코드의 환경 정보도 JSON 으로 쓰는 경우가 많습니다. 하지만 JSON 이 정말 편안한 형태인가? 에 대해서는 쉽게 고개를 끄덕이긴 어렵습니다. 파싱(Parsing) 하는 과정이 은근 까다로울때가 많고, 특히 JSON 이 중첩되어 있을 경우에는 더욱 그렇습니다.
파이썬에서 requests 모듈을 이용하여 JSON 으로 응답하는 API 를 호출하기 위하여 아래와 같이 간단한 코드를 만들었습니다. 응답 결과가 JSON 이기 때문에 응답에 대하여 JSON 으로 쉽게 읽을 수 있겠지? 하는 마음에 json() 메서드를 호출해서 변수에 담았습니다.
import requests
import json
_target = "https://www.example.com/api"
s = requests.Session()
result = s.get(_target).json()
데이터는 JSON 의 모습이지만 이 자료가 어떤 형태인지는 type 으로 찍어보거나 requests 모듈의 문서를 찾아서 json() 메서드의 자료형을 살펴봐야 합니다. 간단히 코드를 만들어서 확인해보니 문자열 형태가 아닌 Dictionary 형태의 자료였습니다. print 문 등으로 출력을 해보면 마치 JSON 처럼 생긴 결과가 나오지만 JSON 의 규격과 맞지 않아 JSON Validator 를 이용해보면 파싱이 제대로 되지 않습니다.
여기서 또 한가지의 문제는 이 응답 결과를 for 문으로 이용하는 코드를 만들었을 때 생깁니다. Dictionary 형태의 데이터였지만 특정 Key 의 값을 꺼내어 확인해보면 Dictionary 가 아닌 List 형으로 변경된 것을 알 수 있습니다. 자료형이 어떻게 바뀌어 가는지를 제대로 가늠하지 못하고 코드를 만들다 보니 한참을 헤메일 수 밖에 없었습니다. 결과에서 특정한 값이 필요할 때는 Dictionary 가 편하지만 Javascript 등에서 JSON 을 필요로 할 때는 문자열 형태로 전달해서 JSON 으로 파싱할 수 있도록 해주는 것이 좋습니다.
result = s.get(_target).json()
print(type(result)) # DICT
result_json = json.dumps(result)
print(type(result_json)) # JSON
result_dict_again = json.loads(result_json)
print(type(result_dict_again)) # DICT
json 모듈이 제공하는 json.dumps() 메서드는 자료형을 JSON 형태로 (단순 문자열입니다!) 바꿔주는 역할을 하고, json.loads() 메서드는 문자열 자료를 파싱하여 Dictionary 의 Key, Value 형태로 변경해줍니다. 파이썬 내에서 자료를 핸들링 할때는 Dictionary 를 이용하고 외부로 전달할 때는 JSON 형태로 쉽게 바꿀 수 있게 되었습니다. 오늘도 파이썬 초보는 이렇게 한가지를 또 배워갑니다.
사놓고 보지 않는 혼공파... 틈틈히 읽어야겠습니다 ㅜㅜ (반성..반성..)
본 포스팅은 소정의 수수료를 지급받을 수 있습니다