JSON 데이터 다루기 (직렬화와 역직렬화)

앞서 파이썬의 중급 과정 핵심 기술인 검색과 정렬 알고리즘, 그리고 정규표현식까지 살펴보았습니다. 이번 글에서는 현대 웹 개발과 시스템 간 데이터 교환의 표준인 JSON(JavaScript Object Notation)의 구조를 이해하고, 파이썬 내장 json 모듈을 활용해 데이터를 자유롭게 변환하는 방법을 완벽하게 정복해 보겠습니다.

1. JSON이란 무엇인가?

JSON(JavaScript Object Notation)은 데이터 교환을 위해 설계된 가볍고 읽기 쉬운 데이터 형식입니다. 사람이 읽고 쓰기 쉬울뿐만 아니라 컴퓨터가 파싱(Parsing)하고 생성하기도 매우 쉽습니다.

JSON은 웹 애플리케이션에서 서버와 클라이언트 간에 데이터를 전송하거나, 설정 파일을 저장하는 등 거의 모든 프로그래밍 환경에서 광범위하게 사용되는 사실상의 표준 데이터 형식입니다.

2. JSON의 기본 구조와 특징

JSON은 이름에서 알 수 있듯이 자바스크립트 객체를 표기하는 방식에서 유래했지만, 현재는 특정 언어에 종속되지 않고 독립적으로 사용됩니다.

2.1 핵심 구성 요소

JSON 데이터는 두 가지 구조적 단위로 표현됩니다.

  • 객체 (Objects): 중괄호 {}로 둘러싸인 순서가 없는 key: value 쌍의 집합입니다.

    • 키(Key): 반드시 문자열(String)이어야 하며, 반드시 큰따옴표 ""로 묶어야 합니다.

    • 값(Value): 유효한 JSON 타입 중 하나여야 합니다. (예: {"name": "Alice", "age": 30})

  • 배열 (Arrays): 대괄호 []로 둘러싸인 순서가 있는 값(Value)들의 리스트입니다. (예: ["apple", "banana", "cherry"])

2.2 유효한 데이터 타입 (Values)

JSON에서 값(Value)으로 올 수 있는 타입은 매우 제한적이며 다음과 같습니다.

타입 설명 예시
String 유니코드 문자열 (반드시 큰따옴표 사용) "Hello World"
Number 정수 또는 부동소수점 숫자 (0~9) 123, 3.14
Object JSON 객체 ({}) {"city": "Seoul"}
Array JSON 배열 ([]) [1, 2, 3]
Boolean 논리 값 (true 또는 false) true, false
null 값이 없음을 나타냄 null

⚠️ 주의사항:

  • JSON에는 파이썬의 None, 자바스크립트의 undefined 등이나 함수(Function) 타입은 허용되지 않습니다.

  • 문자열을 묶을 때 반드시 큰따옴표(")를 사용해야 합니다. (작은따옴표 사용 불가)

3. JSON의 주요 장점

  • 가독성: 구조가 단순하고 계층적이며, 텍스트 기반이라 사람이 읽고 쓰기 편합니다.

  • 호환성: 거의 모든 현대 프로그래밍 언어(Python, Java, C#, JavaScript, PHP 등)가 JSON을 파싱하고 생성하는 기본 기능을 제공합니다.

  • 경량성: XML에 비해 문법적 오버헤드(Overhead)가 적어 데이터 용량이 작고 전송 속도가 빠릅니다.

4. 파이썬 json 모듈을 이용한 데이터 변환

파이썬에서는 json이라는 내장 모듈을 사용하여 파이썬 객체와 JSON 문자열 간의 상호 변환을 수행할 수 있습니다. 이 과정을 각각 직렬화(Serialization)와 역직렬화(Deserialization)라고 합니다.

용어 함수 설명
직렬화 json.dumps() (Dump String) 파이썬 객체(딕셔너리, 리스트 등)를 JSON 형식의 문자열로 변환합니다.
역직렬화 json.loads() (Load String) JSON 형식의 문자열을 파이썬 객체(주로 딕셔너리나 리스트)로 변환합니다.

파이썬 데이터 타입과 JSON 타입의 매핑

파이썬 타입 JSON 타입
dict Object
list, tuple Array
str String
int, float Number
True, False Boolean (true, false)
None null (null)

실전 코드 예제

import json

# 파이썬 딕셔너리 (객체)
python_data = {
    "name": "Bob",
    "is_active": True,
    "items": [10, 20]
}

# 1. 직렬화: 파이썬 객체 -> JSON 문자열 (indent로 들여쓰기 지정 가능)
json_string = json.dumps(python_data, indent=4) 
print(json_string) 
# 출력:
# {
#     "name": "Bob",
#     "is_active": true,
#     "items": [
#         10,
#         20
#     ]
# }

# 2. 역직렬화: JSON 문자열 -> 파이썬 객체
new_data = json.loads(json_string)
print(new_data['name']) # 출력: Bob
print(type(new_data))   # 출력: <class 'dict'>

답글 남기기