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 변환 시 발생할 수 있는 문제 해결

  1. Unicode 문자 문제: ensure_ascii=False를 사용하여 UTF-8 인코딩 유지
  2. Datetime 직렬화 문제: default=str을 사용하거나 isoformat() 활용
  3. 객체 변환 문제: default 매개변수를 활용하여 변환 함수 지정

JSON과 다른 데이터 포맷 비교

포맷장점단점
JSON가볍고 가독성이 높음, 대부분의 언어에서 지원데이터 타입이 제한적, XML보다 표현력이 낮음
XML구조화된 데이터 표현 가능, 문서 성격의 데이터에 적합가독성이 낮고 용량이 큼
YAML사람이 읽기 쉬움, 주석 지원파싱 속도가 느릴 수 있음

Python의 json 모듈을 사용하면 JSON 데이터를 쉽게 인코딩하고 디코딩할 수 있습니다. 기본적인 dumps(), loads() 함수뿐만 아니라, 파일 저장(dump, load) 및 사용자 정의 객체 변환 기능을 활용하면 더욱 유용하게 사용할 수 있습니다. JSON을 다룰때 효율적으로 데이터를 처리해 볼 수 있습니다.

By Mark

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다