Python에서 JSON 데이터를 다룰 때 가장 빈번하게 사용하는 내장 라이브러리는 json 모듈입니다. 이 모듈의 load()와 loads()는 JSON 포맷을 Python 객체(주로 딕셔너리나 리스트)로 변환하는 '역직렬화' 기능을 수행하지만, 데이터의 입력 출처에 따라 구분하여 사용해야 합니다.
기본 개념
json.load(): 파일 객체(File-like object)로부터 JSON 데이터를 읽어올 때 사용합니다.json.loads(): 메모리에 있는 JSON 형식의 문자열(String)을 파싱할 때 사용합니다.
주요 데이터 타입 매핑
JSON 데이터를 파싱하면 Python의 표준 타입으로 다음과 같이 변환됩니다.
| JSON | Python |
|---|---|
| object | dict |
| array | list |
| string | str |
| number (int/float) | int/float |
| true/false | True/False |
| null | None |
json.load() 활용: 파일 기반 데이터 처리
외부 파일에 저장된 JSON 데이터를 가져올 때는 open() 함수로 생성된 파일 객체를 직접 전달합니다.
import json
# 파일로부터 데이터 로드
with open("data.json", "r", encoding="utf-8") as f:
config = json.load(f)
# 특정 키 접근
print(f"사용자 이름: {config.get('username')}")
json.loads() 활용: 문자열 기반 데이터 처리
API 응답이나 네트워크를 통해 받은 문자열 형태의 JSON을 다룰 때 유용합니다.
import json
raw_data = '{"id": 101, "status": "active", "roles": ["admin", "editor"]}'
# 문자열 파싱
user_info = json.loads(raw_data)
print(f"상태: {user_info['status']}")
print(f"첫 번째 역할: {user_info['roles'][0]}")
고급 활용: 커스텀 데이터 처리
데이터 파싱 시 특정 형식으로 값을 변환하거나, 데이터 순서를 보장해야 할 경우 옵션을 활용할 수 있습니다.
1. 순서 보장 (OrderedDict)
데이터의 입력 순서를 유지해야 한다면 object_pairs_hook을 사용하여 파싱 결과를 OrderedDict으로 받을 수 있습니다.
from collections import OrderedDict
import json
data = '{"apple": 1, "banana": 2, "cherry": 3}'
ordered_map = json.loads(data, object_pairs_hook=OrderedDict)
print(ordered_map)
2. 타입 기반 커스텀 파싱
parse_float나 parse_int를 사용하면 수치 데이터가 파싱되는 즉시 가공할 수 있습니다.
import json
def custom_float_handler(value):
return round(float(value), 2)
json_str = '{"price": 1234.5678}'
data = json.loads(json_str, parse_float=custom_float_handler)
print(data['price']) # 1234.57로 반올림 처리됨