JSON(JavaScript Object Notation)은 데이터 교환 형식으로 널리 사용되는 경량 데이터 형식입니다. JSON은 사람이 읽고 쓰기 쉬우며, 파이썬을 포함한 다양한 프로그래밍 언어에서 쉽게 처리할 수 있습니다. 파이썬에서는 내장 모듈인 json을 사용하여 JSON 데이터를 읽고 쓰며, 파싱하는 작업을 간단히 수행할 수 있습니다. 이번 포스팅에서는 파이썬에서 JSON 데이터를 처리하는 방법에 대해 알아보겠습니다.

1. JSON이란?

JSON은 키-값 쌍으로 이루어진 데이터 객체를 표현하는 형식입니다. JSON은 텍스트 형식으로 데이터를 구조화하여 저장하거나 전송할 때 사용됩니다. JSON은 자바스크립트에서 유래했지만, 언어 독립적인 형식으로 거의 모든 언어에서 지원됩니다.

1.1. JSON 예제

다음은 간단한 JSON 데이터의 예시입니다.

{
    "name": "John Doe",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Science", "History"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "CA"
    }
}

이 JSON 객체는 이름, 나이, 학생 여부, 수강 과목 목록, 주소 등을 포함하는 정보를 나타냅니다.

2. 파이썬에서 JSON 모듈 사용하기

파이썬의 json 모듈을 사용하면 JSON 데이터를 쉽게 파싱하고, 생성할 수 있습니다. json 모듈은 JSON 데이터를 파이썬의 기본 데이터 타입(딕셔너리, 리스트 등)으로 변환하거나 그 반대로 변환하는 기능을 제공합니다.

2.1. JSON 문자열을 파이썬 객체로 변환하기 (json.loads)

json.loads() 함수는 JSON 문자열을 파이썬 객체로 변환합니다.

import json

# JSON 문자열
json_str = '''
{
    "name": "John Doe",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Science", "History"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "CA"
    }
}
'''

# JSON 문자열을 파이썬 객체로 변환
data = json.loads(json_str)

# 변환된 파이썬 객체 출력
print(data)
print(type(data))  # 출력: <class 'dict'>

위 코드에서는 JSON 문자열을 파이썬의 딕셔너리로 변환하고, 변환된 객체를 출력합니다.

2.2. 파이썬 객체를 JSON 문자열로 변환하기 (json.dumps)

json.dumps() 함수는 파이썬 객체를 JSON 문자열로 변환합니다.

import json

# 파이썬 객체 (딕셔너리)
data = {
    "name": "John Doe",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science", "History"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "CA"
    }
}

# 파이썬 객체를 JSON 문자열로 변환
json_str = json.dumps(data, indent=4)

# 변환된 JSON 문자열 출력
print(json_str)

위 코드에서는 파이썬의 딕셔너리를 JSON 문자열로 변환하고, 가독성을 높이기 위해 indent=4 옵션을 사용하여 들여쓰기된 JSON 문자열을 출력합니다.

2.3. JSON 파일 읽기 (json.load)

JSON 데이터를 파일에서 읽어올 때는 json.load() 함수를 사용합니다.

import json

# JSON 파일 읽기
with open('data.json', 'r') as file:
    data = json.load(file)

# 읽어온 데이터 출력
print(data)

위 코드에서는 data.json 파일을 열고, JSON 데이터를 읽어와 파이썬 객체로 변환한 후 출력합니다.

2.4. JSON 파일 쓰기 (json.dump)

파이썬 객체를 JSON 형식으로 파일에 저장할 때는 json.dump() 함수를 사용합니다.

import json

# 파이썬 객체 (딕셔너리)
data = {
    "name": "John Doe",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science", "History"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "CA"
    }
}

# JSON 파일에 쓰기
with open('output.json', 'w') as file:
    json.dump(data, file, indent=4)

위 코드에서는 파이썬의 딕셔너리를 output.json 파일에 JSON 형식으로 저장합니다.

3. JSON 데이터 처리의 실용적인 예제

3.1. API 응답 데이터 처리

JSON은 웹 API에서 데이터를 주고받을 때 자주 사용됩니다. 파이썬의 requests 라이브러리를 사용하여 JSON 형식의 API 응답을 처리하는 방법을 살펴보겠습니다.

import requests
import json

# JSON 형식의 API 응답 받기
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')

# 응답 데이터를 JSON으로 파싱
data = response.json()

# JSON 데이터를 파이썬 객체로 처리
print(data)
print(data['title'])  # 특정 키 값 출력

위 코드에서는 jsonplaceholder.typicode.com의 API로부터 JSON 형식의 데이터를 받아와 파싱하고, 파이썬 객체로 처리합니다.

3.2. JSON 데이터를 CSV 파일로 변환

JSON 데이터를 CSV 파일로 변환하는 것은 데이터를 다양한 분석 도구에서 사용하기 쉽게 만드는 방법 중 하나입니다.

import json
import csv

# JSON 데이터
json_data = '''
[
    {"name": "John Doe", "age": 30, "city": "New York"},
    {"name": "Jane Doe", "age": 25, "city": "Los Angeles"},
    {"name": "Mike Smith", "age": 35, "city": "Chicago"}
]
'''

# JSON 문자열을 파이썬 객체로 변환
data = json.loads(json_data)

# CSV 파일에 쓰기
with open('output.csv', 'w', newline='') as file:
    writer = csv.DictWriter(file, fieldnames=["name", "age", "city"])
    writer.writeheader()
    writer.writerows(data)

위 코드에서는 JSON 데이터를 파싱한 후, CSV 파일로 변환하여 저장합니다.

4. JSON 데이터의 고급 처리

4.1. 커스텀 JSON 인코딩

기본적으로 json 모듈은 파이썬의 기본 데이터 타입을 JSON으로 변환할 수 있습니다. 하지만 커스텀 객체를 JSON으로 변환하려면 커스텀 인코더를 구현해야 합니다.

import json
from datetime import datetime

# 커스텀 클래스
class Person:
    def __init__(self, name, birthdate):
        self.name = name
        self.birthdate = birthdate

# 커스텀 JSON 인코더
class PersonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Person):
            return {
                "name": obj.name,
                "birthdate": obj.birthdate.strftime('%Y-%m-%d')
            }
        return super().default(obj)

# Person 객체를 JSON 문자열로 변환
person = Person("John Doe", datetime(1990, 5, 15))
json_str = json.dumps(person, cls=PersonEncoder, indent=4)
print(json_str)

위 코드에서는 Person 클래스와 이를 JSON으로 변환하기 위한 커스텀 인코더를 구현하고, 이를 사용하여 JSON 문자열로 변환합니다.

4.2. JSON 데이터의 정렬 및 가독성 향상

JSON 데이터를 가독성 있게 출력하려면 indent와 sort_keys 옵션을 사용할 수 있습니다.

import json

data = {
    "name": "John Doe",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science", "History"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "CA"
    }
}

# 가독성 있는 JSON 출력
json_str = json.dumps(data, indent=4, sort_keys=True)
print(json_str)

위 코드에서는 indent=4 옵션을 사용하여 JSON 데이터를 들여쓰고, sort_keys=True 옵션을 사용하여 키를 알파벳 순으로 정렬합니다.

5. JSON과 보안

5.1. JSON 데이터의 보안 고려 사항

JSON 데이터를 다룰 때 보안에 유의해야 합니다. 특히, 사용자

입력을 받아 JSON으로 변환하거나 JSON 데이터를 출력할 때는 보안 취약점에 주의해야 합니다. 다음은 몇 가지 보안 고려 사항입니다.

  • 입력 데이터 검증: JSON으로 변환하기 전에 사용자 입력을 철저히 검증해야 합니다.
  • 출력 이스케이핑: JSON 데이터를 HTML에 직접 출력하는 경우, XSS(Cross-Site Scripting) 공격을 방지하기 위해 데이터를 적절히 이스케이핑해야 합니다.
  • 시리얼라이제이션 라이브러리 선택: JSON 데이터 시리얼라이제이션에 안전한 라이브러리를 사용하고, 잠재적인 보안 이슈를 피해야 합니다.

결론

이번 포스팅에서는 파이썬에서 JSON 데이터를 처리하는 방법에 대해 알아보았습니다. JSON은 데이터를 저장하고 전송하는 데 널리 사용되는 형식으로, 파이썬의 json 모듈을 사용하여 JSON 데이터를 쉽게 읽고 쓸 수 있습니다. JSON 데이터를 처리하는 기본적인 방법부터 고급 처리 기법, 그리고 보안 고려 사항까지 살펴보았습니다. 실습을 통해 JSON 데이터 처리에 익숙해지고, 이를 활용하여 다양한 애플리케이션에서 데이터를 효과적으로 관리해 보세요.


이 글을 통해 파이썬의 JSON 데이터 처리 방법을 이해하고, 실습을 통해 이를 사용하는 방법을 익힐 수 있을 것입니다. JSON 데이터를 자유롭게 다루며, 데이터 교환과 저장을 더 효율적으로 수행해 보세요!

+ Recent posts