JSON 개요
JSON(JavaScript Object Notation)은 데이터 교환을 위한 가벼운 텍스트 형식으로, 객체, 배열, 문자열, 숫자, 논리값(Boolean), null 값을 지원합니다. JSON 구조는 다음과 같은 특징을 갖습니다:
- 단일 인용 부호만 허용
- 요소 간 구분자로 쉼표 사용 (마지막 요소에는 쉼표 없음)
- 주석 기능 미지원
- 특수 문자는 ASCII 코드로 변환 필요 (\uXXX 형식)
- 중첩된 객체/배열 구조 가능
예시 파일 형식: sample.json
{
"이름": "Cactus",
"나이": 18,
"기술": ["파이썬", "자바", "고", "노드JS"],
"블로그": true,
"결혼": null
}
JSON과 Python 데이터 유형 매핑
| JSON 형식 | Python 유형 |
|---|---|
| 객체 | 딕셔너리 |
| 배열 | 리스트 |
| 문자열 | 문자열 |
| 숫자 | 정수/실수 |
| 논리값 | True/False |
| null | None |
주의: Python 내 JSON은 JSON 문법에 맞는 문자열로, 단일 또는 다중 줄로 구성된 문자열 형태입니다.
JSON 문자열과 딕셔너리 변환
변환 필요성: JSON은 저장 전송에 적합하지만 값 추출이 어려우며, 딕셔너리는 메모리 접근이 용이하지만 전송 시 불편함이 있음
Python 내장 json 모듈을 사용하여 변환 가능
- json.dumps(딕셔너리): 딕셔너리를 JSON 문자열로 변환
- json.loads(JSON 문자열): JSON 문자열을 딕셔너리로 변환 (잘못된 형식 시 JSONDecodeError 발생)
예시1: 딕셔너리 → JSON 문자열
import json
data = {
'이름': 'Cactus',
'나이': 18,
'기술': ['파이썬', '자바', '고', '노드JS'],
'블로그': True,
'결혼': None
}
print(json.dumps(data))
print(json.dumps(data, indent=4, sort_keys=True, ensure_ascii=False))
json.dumps() 파라미터 설명:
- indent: 출력 형식 지정 (0이면 단일 줄)
- sort_keys: 키 순서 정렬 여부
- ensure_ascii: 비ASCII 문자 처리 방식
출력 결과:
{"이름": "Cactus", "나이": 18, "기술": ["파이썬", "자바", "고", "노드JS"], "블로그": true, "결혼": null}
{
"나이": 18,
"결혼": null,
"블로그": true,
"이름": "Cactus",
"기술": [
"파이썬",
"자바",
"고",
"노드JS"
]
}
예시2: JSON 문자열 → 딕셔너리
import json
json_str = '''{
"이름": "Cactus",
"나이": 18,
"기술": ["파이썬", "자바", "고", "노드JS"],
"블로그": true,
"결혼": null
}'''
print(json.loads(json_str))
출력 결과:
{'이름': 'Cactus', '나이': 18, '기술': ['파이썬', '자바', '고', '노드JS'], '블로그': True, '결혼': None}
JSON 파일과 딕셔너리 변환
직접 딕셔너리와 파일 간 변환도 가능
- json.dump(딕셔너리, 파일객체): 딕셔너리를 JSON 파일로 저장
- json.load(파일객체): JSON 파일을 딕셔너리로 로드
예시3: 딕셔너리 → JSON 파일
import json
data = {
'이름': 'Cactus',
'나이': 18,
'기술': ['파이썬', '자바', '고', '노드JS'],
'블로그': True,
'결혼': None
}
with open("sample.json", "w", encoding='utf-8') as f:
json.dump(data, f, indent=4, sort_keys=True, ensure_ascii=False)
생성된 sample.json 파일 내용:
{
"나이": 18,
"결혼": null,
"블로그": true,
"이름": "Cactus",
"기술": [
"파이썬",
"자바",
"고",
"노드JS"
]
}
예시4: JSON 파일 → 딕셔너리
import json
with open("sample.json", encoding="utf-8") as f:
loaded_data = json.load(f)
print(loaded_data)
출력 결과:
{'나이': 18, '결혼': None, '블로그': True, '이름': 'Cactus', '기술': ['파이썬', '자바', '고', '노드JS']}
참고: 날짜 객체 등 Python 고유 객체는 변환 불가능하며, 복잡한 구조는 JSONPath를 활용해 분석 가능