Programming/python

Python JSON 문자열 파싱 가이드

moxie2ks 2025. 10. 14. 18:01
728x90
반응형

개요

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 모듈의 다양한 옵션을 활용하면 안정적이고 가독성 높은 코드를 작성할 수 있다.

참고문헌

728x90
반응형