2.1 모듈 json
JSON (JavaScript Object Notation) — 사람도 쉽게 읽고 쓸 수 있으며 컴퓨터가 쉽게 분석하고 생성할 수 있는 가벼운 데이터 교환 형식이야. JSON은 서버와 웹 애플리케이션 간 데이터 전송에 자주 사용되며, 설정과 구성 저장에도 많이 쓰이지.
모듈 json
은 Python에서 직렬화
(Python 객체를 JSON 문자열로 변환)와 역직렬화
(JSON 문자열을 Python 객체로 변환) 기능을 제공해. 이 모듈은
Python의 표준 라이브러리에 내장되어 있으며, JSON 데이터를 처리할 때 활발히 사용돼.
모듈 json
의 주요 함수는
pickle
과 상당히 비슷하고 비슷하게 작동해. 원하던 대로
표준이니까!
-
문자열 작업:
-
json.dumps(obj)
— Python 객체를 JSON 문자열로 변환. -
json.loads(s)
— JSON 문자열을 Python 객체로 변환.
-
-
파일 작업:
-
json.dump(obj, file)
— Python 객체를 직렬화하여 텍스트 파일에 기록. -
json.load(file)
— JSON 형식의 데이터를 포함한 텍스트 파일에서 Python 객체를 역직렬화.
-
이 함수들이 어떻게 작동하는지 더 잘 기억하기 위해 몇 가지 예시를 살펴보자.
2.2 문자열로 직렬화
Python 객체를 JSON 문자열로 직렬화
객체를 문자열로 직렬화하기 위해서는
json.dumps()
함수에 객체를 전달하면 돼.
import json
# 직렬화를 위한 객체 예시
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
# Python 객체를 JSON 문자열로 변환
json_string = json.dumps(data, indent=4)
print("직렬화된 데이터 (JSON):", json_string)
JSON 문자열을 Python 객체로 역직렬화
객체를 문자열에서 얻으려면, 객체 설명을 포함하는 JSON 문자열을
json.loads()
메서드에 전달하면 돼.
import json
# 역직렬화를 위한 JSON 문자열 예시
json_string = '''
{
"name": "Alice",
"age": 30,
"is_student": false,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
'''
# JSON 문자열을 Python 객체로 변환
data = json.loads(json_string)
print("역직렬화된 데이터 (Python):", data)
2.3 파일로 직렬화
Python 객체를 JSON 형식으로 파일에 기록하기
객체를 파일에 기록하기 위해서는
json.dump()
메서드를 호출하면 돼. 파일 작업 시 잠재적인 오류를 제대로 처리하기 위해 예외 처리를 사용하는 것이 중요해. 다음은 예시야:
import json
# 직렬화를 위한 객체 예시
data = {
"name": "Bob",
"age": 25,
"is_student": True,
"courses": ["History", "Literature"],
"address": {
"city": "Los Angeles",
"zip_code": "90001"
}
}
# 예외 처리를 사용한 Python 객체의 JSON 파일 기록
try:
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
print("데이터가 파일에 성공적으로 기록되었습니다.")
except IOError:
print("파일 기록 중 오류 발생.")
except json.JSONEncodeError:
print("JSON 인코딩 중 오류 발생.")
JSON 형식의 파일에서 Python 객체 읽기
파일에서 읽기도 매우 간단해 — 파일을
json.load()
메서드에 전달하면 돼. 여기서도 예외 처리를 사용하는 것이 중요해:
import json
# 예외 처리를 사용한 JSON 파일에서 Python 객체 읽기
try:
with open('data.json', 'r') as file:
data = json.load(file)
print("파일에서 역직렬화된 데이터 (Python):", data)
except IOError:
print("파일 읽기 중 오류 발생.")
except json.JSONDecodeError:
print("JSON 디코딩 중 오류 발생.")
2.4 함수의 추가 매개변수
직렬화를 담당하는 함수에 추가 매개변수를 전달할 수 있어, 너의 JSON을 더 멋지게 만들 수 있지:
-
skipkeys
:True
인 경우 문자열, 숫자 또는None
이 아닌 키를 건너뜀. -
ensure_ascii
:True
인 경우 모든 비-ASCII 문자는 Unicode 이스케이프 시퀀스를 사용해 이스케이프 됨. -
indent
: 숫자가 지정되면 가독성을 위해 들여쓰기가 추가됨. -
sort_keys
:True
인 경우 JSON의 키가 알파벳 순서로 정렬됨.
json.dumps()
매개변수 사용 예시:
import json
data = {"c": 3, "b": 2, "a": 1}
# 키 정렬 및 들여쓰기로 직렬화
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
2.5 사용자 정의 디코더와 인코더
모듈 json
은 객체의 직렬화와 역직렬화를 위한 사용자 정의 함수를 사용할 수 있어.
사용자 정의 인코더 예제
먼저 객체가
datetime 타입인 경우 객체를 ISO 형식의 문자열로 반환하는
특정 클래스 인코더를 생성해.
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {
"name": "Alice",
"timestamp": datetime.now()
}
# 사용자 정의 인코더로 직렬화
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)
사용자 정의 디코더 예제
반대 작업을 위해서는 문자열을 날짜로 변환하는 함수도 필요해. 예를 들어
필드 이름이 timestamp라면 문자열을 datetime 객체로 변환할 수 있음
:
import json
from datetime import datetime
def custom_decoder(dct):
if 'timestamp' in dct:
dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
return dct
json_string = '''
{
"name": "Alice",
"timestamp": "2023-05-15T14:30:00"
}
'''
# 사용자 정의 디코더로 역직렬화
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
GO TO FULL VERSION