개요
JSON(JavaScript Object Notation)은 데이터 교환을 위한 경량 형식으로, 현대 웹 개발과 API 통신에서 가장 널리 사용되는 데이터 형식이다. Python에서는 문자열 형태로 전달되는 JSON 데이터를 파싱 하여 사용 가능한 객체로 변환하는 작업이 빈번하게 발생한다. 본 글에서는 Python의 json 모듈을 활용하여 문자열 형식의 JSON 데이터를 효과적으로 처리하는 방법을 다룬다.
설명
Python의 내장 모듈인 json은 JSON 데이터를 Python 객체로 변환하거나 그 반대의 작업을 수행하는 기능을 제공한다. JSON 문자열을 Python 객체로 변환하는 과정을 역직렬화(Deserialization)라고 하며, 이는 json.loads() 함수를 통해 이루어진다.
주요 함수
json.loads(): JSON 문자열을 Python 객체로 변환한다. 's'는 'string'을 의미한다.json.dumps(): Python 객체를 JSON 문자열로 변환한다. 's'는 'string'을 의미한다.json.load(): JSON 파일을 읽어 Python 객체로 변환한다.json.dump(): Python 객체를 JSON 파일로 저장한다.
JSON과 Python 데이터 타입 간의 변환 관계는 다음과 같다:
| JSON 타입 | Python 타입 |
|---|---|
| object | dict |
| array | list |
| string | str |
| number (int) | int |
| number (real) | float |
| true | True |
| false | False |
| null | None |
특징
1. 간편한 문법
json 모듈은 직관적인 API를 제공하여 단 한 줄의 코드로 JSON 문자열을 파싱할 수 있다.
2. 유니코드 지원
ensure_ascii=False 옵션을 사용하면 한글과 같은 유니코드 문자를 원본 그대로 유지할 수 있다.
3. 포맷팅 옵션
indent 파라미터를 통해 JSON 출력의 가독성을 높일 수 있으며, sort_keys 옵션으로 키를 알파벳 순으로 정렬할 수 있다.
4. 에러 핸들링
잘못된 형식의 JSON 문자열을 파싱하려 할 때 json.JSONDecodeError 예외를 발생시켜 명확한 오류 처리가 가능하다.
예제
기본 파싱
import json
# JSON 문자열 정의
json_string = '{"name": "홍길동", "age": 30, "city": "서울"}'
# 문자열을 Python 딕셔너리로 변환
data = json.loads(json_string)
print(data) # {'name': '홍길동', 'age': 30, 'city': '서울'}
print(type(data)) # <class 'dict'>
print(data['name']) # 홍길동
복잡한 구조 파싱
import json
# 중첩된 JSON 구조
json_string = '''
{
"users": [
{"id": 1, "name": "김철수", "active": true},
{"id": 2, "name": "이영희", "active": false}
],
"total": 2,
"metadata": {
"version": "1.0",
"timestamp": "2025-10-13"
}
}
'''
# 파싱
data = json.loads(json_string)
# 데이터 접근
print(data['users'][0]['name']) # 김철수
print(data['metadata']['version']) # 1.0
# 리스트 순회
for user in data['users']:
print(f"ID: {user['id']}, 이름: {user['name']}")
Python 객체를 JSON 문자열로 변환
import json
# Python 딕셔너리
data = {
"product": "노트북",
"price": 1500000,
"specs": {
"cpu": "Intel i7",
"ram": "16GB"
}
}
# JSON 문자열로 변환 (예쁘게 포맷)
json_string = json.dumps(data, indent=2, ensure_ascii=False)
print(json_string)
에러 핸들링
import json
# 잘못된 JSON 문자열
invalid_json = '{"name": "홍길동", "age": 30,}' # 마지막 쉼표가 문제
try:
data = json.loads(invalid_json)
except json.JSONDecodeError as e:
print(f"JSON 파싱 오류: {e}")
print(f"오류 위치: line {e.lineno}, column {e.colno}")
파일에서 JSON 읽기
import json
# JSON 파일 읽기
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f) # loads가 아닌 load 사용
print(data)
# JSON 파일로 저장
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
결론
Python의 json 모듈은 JSON 데이터를 처리하기 위한 강력하고 사용하기 쉬운 도구를 제공한다. json.loads() 함수를 사용하면 문자열 형식의 JSON을 손쉽게 Python 객체로 변환할 수 있으며, 반대로 json.dumps() 함수를 통해 Python 객체를 JSON 문자열로 직렬화할 수 있다.
API 응답 처리, 설정 파일 관리, 데이터 교환 등 다양한 상황에서 JSON 파싱은 필수적인 작업이다. 적절한 에러 핸들링과 함께 json 모듈의 다양한 옵션을 활용하면 안정적이고 가독성 높은 코드를 작성할 수 있다.
참고문헌
- Python 공식 문서 - json 모듈: https://docs.python.org/3/library/json.html
- JSON 공식 웹사이트: https://www.json.org/json-ko.html
- Real Python - Working With JSON Data in Python: https://realpython.com/python-json/
- Python JSON Tutorial: https://www.w3schools.com/python/python_json.asp
'Programming > python' 카테고리의 다른 글
| SQLAlchemy로 데이터베이스 메타데이터 탐색하기: 스키마와 테이블 정보 활용법 (0) | 2026.01.21 |
|---|---|
| Oracle DB와 SQLAlchemy: 세미콜론 문제와 ORA-00933 에러 (0) | 2025.12.04 |
| FastAPI에서 ThreadPoolExecutor를 활용한 동기 코드의 비동기 실행 (0) | 2025.10.13 |
| __del__과 weakref.finalize (6) | 2025.07.17 |
| Python GIL (10) | 2025.07.16 |