이번 편의 목표: JSON과 파이썬 자료형의 대응을 이해하고 한글을 저장합니다.
CSV는 표 형태의 자료에 잘 맞습니다. 프로그램 설정처럼 한 값 안에 목록이나 다른 묶음이 들어가면 JSON이 더 자연스럽습니다. 예산 금액과 분류 목록을 함께 저장해 보겠습니다.
파이썬 객체와 JSON 텍스트는 다르다
import json
from pathlib import Path
config = {
"monthly_budget": 300000,
"categories": ["식비", "교통", "문구"],
"show_details": True,
"memo": None,
}
path = Path("practice_output") / "config_demo.json"
path.parent.mkdir(parents=True, exist_ok=True)
with path.open("w", encoding="utf-8") as file:
json.dump(config, file, ensure_ascii=False, indent=2)
with path.open("r", encoding="utf-8") as file:
loaded = json.load(file)
print(loaded["monthly_budget"])
print(loaded["categories"][0])
text = json.dumps(config, ensure_ascii=False)
print(type(text))
restored = json.loads(text)
print(restored == config)결과의 핵심은 `300000`, `식비`, `<class 'str'>`, `True`입니다. `dump()`는 파일로, `dumps()`는 문자열로 내보냅니다. `load()`는 파일에서, `loads()`는 문자열에서 읽습니다. 이름 끝의 `s`를 문자열로 기억하면 혼동이 줄어듭니다.
`ensure_ascii=False`는 한글을 읽기 쉬운 모습으로 출력합니다. `indent=2`는 들여쓰기를 넣습니다. 둘 다 자료의 의미를 바꾸는 옵션은 아닙니다. 위 코드는 실행할 때 데모 설정 파일을 덮어씁니다.
대응하는 자료형
파이썬 — JSON 딕셔너리 — object 리스트 — array 문자열 — string 정수·실수 — number True, False — true, false None — null
JSON 문법은 파이썬 딕셔너리를 화면에 출력한 모습과 비슷하지만 같다고 생각하면 안 됩니다. 문자열에는 큰따옴표를 쓰고, 참·거짓은 소문자이며, 일반 JSON에는 주석을 넣지 않습니다. `str(config)`로 만든 문자열을 JSON 대신 사용하지 마세요.
JSON 객체의 키는 문자열입니다. 날짜 객체나 집합처럼 JSON에 직접 대응하지 않는 값은 저장 형태를 정해서 변환해야 합니다. 튜플을 저장하면 배열이 되고, 다시 읽을 때 리스트가 된다는 점도 기억하세요.
읽을 수 있다는 것과 올바르다는 것
`json.load()`에 성공했다고 설정이 모두 올바르다는 뜻은 아닙니다. 예산이 `"많이"`라는 문자열이어도 문법적으로는 유효한 JSON입니다. 프로그램이 요구하는 키와 자료형, 범위는 따로 검사해야 합니다.
문법이 깨진 파일은 `json.JSONDecodeError`가 발생합니다. 파일이 없으면 `FileNotFoundError`입니다. 두 상황은 대응이 다릅니다. 없는 설정에 기본값을 쓰기로 정할 수는 있어도, 깨진 설정까지 조용히 덮어쓰면 사용자가 문제를 알아차리기 어렵습니다.
직접 해 보기
JSON 문자열 `{"limit": 10000, "enabled": true}`를 읽어 `enabled`가 참이면 한도 금액을 출력하세요. 문자열을 직접 파이썬 코드로 실행하는 `eval()`을 사용할 필요는 없습니다.
해설
import json
text = '{"limit": 10000, "enabled": true}'
config = json.loads(text)
if config["enabled"]:
print(f"한도: {config['limit']:,}원")출력은 `한도: 10,000원`입니다. 외부에서 받은 자료는 정해진 형식의 파서로 읽는다는 원칙을 기억하세요.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
등록된 댓글이 없습니다.