JSON (JavaScript Object Notation) – Python Document 은 데이터를 구조적으로 표현하는 경량 데이터 교환 형식입니다. Python에서는 내장된 json 모듈을 사용하여 JSON 데이터를 쉽게 다룰 수 있습니다. 이 글에서는 Python에서 JSON을 인코딩(직렬화)하고 디코딩(역직렬화)하는 방법을 설명해보겠습니다.
JSON은 RFC 7159(이전 RFC 4627을 대체) 및 ECMA-404에서 정의된 경량 데이터 교환 형식으로, JavaScript 객체 문법에서 영감을 받았지만 JavaScript의 부분집합은 아닙니다.
JSON의 특징
- 가볍고 단순: XML보다 간결하며, 데이터 전송 시 용량이 작음.
- 가독성이 높음: 사람이 쉽게 읽고 이해할 수 있는 구조.
- 언어 독립적: JavaScript뿐만 아니라 Python, Java, C++, Go 등 다양한 언어에서 사용 가능.
- 키-값 쌍 구조: 데이터를 직관적으로 표현할 수 있음.
- 배열 및 중첩 구조 지원: 복잡한 데이터 구조도 표현 가능.
json.dumps()
주요 매개변수
- indent : 들여쓰기 적용 (
json.dumps(data, indent=4)
) - sort_keys : 키 정렬 (
json.dumps(data, sort_keys=True
)) - ensure_ascii : ASCII 문자 강제 (
json.dumps(data, ensure_ascii=False)
)
json.loads()
주요 특징
- JSON 문자열을 Python의 기본 데이터 타입(딕셔너리, 리스트 등)으로 변환
TypeError
,ValueError
예외 발생 가능 (잘못된 JSON 형식 입력 시)
Json Python Code
import json
#References : https://www.alphavantage.co/
source_string =
'{"Meta Data": {"economy": "Intraday (5min) open, high, low, ' \
'close prices and volume", "Symbol": "IBM", "Last Refreshed": ' \
'"2024-07-12 19:50:00", "Interval": "5min", "Output Size": ' \
'"Compact", "6. Time Zone": "US/Eastern"}, "Time Series (5min)": ' \
'{"2024-07-12 19:50:00": {"open": "182.7850", "high": ' \
'"182.7850", "low": "182.7000", "close": "182.7050", "volume": ' \
'"40"}, "2024-07-12 19:40:00": {"open": "182.7700", "high": ' \
'"182.8300", "low": "182.7700", "close": "182.8300", "volume": ' \
'"527"}, "2024-07-12 19:35:00": {"open": "182.7000", "high": ' \
'"182.7000", "low": "182.7000", "close": "182.7000", "' \
'volume": "111"}}}'
# decoder
json_data = json.loads(source_string)
print(json_data["Meta Data"]["economy"])
for data in json_data["Time Series (5min)"]:
_data = json_data["Time Series (5min)"][data]
avg = (float(tmp_data["high"]) + float(tmp_data["low"]))/2
print(data, "open:", _data["open"], "AVG:", avg, "volume:", _data["volume"] )
# encoder
print(type(json_data)) # <class 'dict'>
print(type(json.dumps(json_data))) # <class 'str'>
Output
Intraday (5min) open, high, low, close prices and volume
2024-07-12 19:50:00 open: 182.7850 AVG: 182.7425 volume: 40
2024-07-12 19:40:00 open: 182.7700 AVG: 182.8 volume: 527
2024-07-12 19:35:00 open: 182.7000 AVG: 182.7 volume: 111
<class 'dict'>
<class 'str'>
JSON 변환 시 발생할 수 있는 문제 해결
- Unicode 문자 문제:
ensure_ascii=False
를 사용하여 UTF-8 인코딩 유지 - Datetime 직렬화 문제:
default=str
을 사용하거나isoformat()
활용 - 객체 변환 문제:
default
매개변수를 활용하여 변환 함수 지정
JSON과 다른 데이터 포맷 비교
포맷 | 장점 | 단점 |
---|---|---|
JSON | 가볍고 가독성이 높음, 대부분의 언어에서 지원 | 데이터 타입이 제한적, XML보다 표현력이 낮음 |
XML | 구조화된 데이터 표현 가능, 문서 성격의 데이터에 적합 | 가독성이 낮고 용량이 큼 |
YAML | 사람이 읽기 쉬움, 주석 지원 | 파싱 속도가 느릴 수 있음 |
Python의 json
모듈을 사용하면 JSON 데이터를 쉽게 인코딩하고 디코딩할 수 있습니다. 기본적인 dumps()
, loads()
함수뿐만 아니라, 파일 저장(dump
, load
) 및 사용자 정의 객체 변환 기능을 활용하면 더욱 유용하게 사용할 수 있습니다. JSON을 다룰때 효율적으로 데이터를 처리해 볼 수 있습니다.