새 글을 빠르게 보려면?
이 블로그 목록을 북마크하고 홈·도구 허브의 가이드 영역도 확인하세요. 글 읽기에 가입이나 메일 구독이 필요 없습니다.
Python JSON 실무에서 자주 부딪히는 문제를 정리했습니다. datetime 직렬화, ensure_ascii=False를 통한 다국어 가독성, GB급 파일 스트리밍, orjson/ujson 선택 기준까지 다룹니다.
Python 백엔드와 데이터 파이프라인에서 JSON은 사실상 기본 포맷입니다. 하지만 운영 환경에서는 datetime, 비ASCII 문자, 대용량 파일 때문에 문제가 자주 발생합니다.
이 글에서는 실무에서 바로 적용 가능한 패턴을 중심으로 다음을 다룹니다.
loads/dumps와 load/dump의 정확한 경계datetime 직렬화 오류를 안정적으로 처리하는 방법ensure_ascii=False로 다국어 텍스트를 읽기 좋게 출력하는 방법json, orjson, ujson의 선택 기준loads/dumps vs load/dumpjson.dumps(obj): Python 객체 -> JSON 문자열json.loads(text): JSON 문자열 -> Python 객체json.dump(obj, file): Python 객체 -> 파일로 저장json.load(file): 파일 -> Python 객체기억법: s가 붙으면 string 입니다.
datetime 직렬화 오류 해결자주 보는 오류:
from datetime import datetime
import json
json.dumps({"now": datetime.now()})
# TypeError: Object of type datetime is not JSON serializable실무에서는 커스텀 인코더를 공통 모듈로 두는 것이 안전합니다.
from datetime import datetime, date
import json
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
if isinstance(obj, date):
return obj.isoformat()
return super().default(obj)
payload = {"now": datetime.now(), "today": date.today()}
print(json.dumps(payload, cls=DateTimeEncoder, ensure_ascii=False, indent=2))고정 포맷이 필요하면 strftime(...)를 사용하세요.
\uXXXX로 보일까?기본 설정에서 json.dumps()는 비ASCII 문자를 이스케이프합니다.
import json
print(json.dumps({"message": "안녕하세요, 세계"}))
# {"message": "\uc548\ub155\ud558\uc138\uc694, \uc138\uacc4"}가독성을 원하면:
import json
print(json.dumps({"message": "안녕하세요, 세계"}, ensure_ascii=False))파일 저장 시 UTF-8 인코딩을 함께 지정하세요.
with open("data.json", "w", encoding="utf-8") as f:
json.dump({"message": "안녕하세요, 세계"}, f, ensure_ascii=False)대형 배열 문서를 json.load()로 한 번에 읽으면 메모리 사용량이 급증할 수 있습니다.
.jsonl) 우선import json
def read_jsonl(path):
with open(path, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
yield json.loads(line)
for obj in read_jsonl("events.jsonl"):
passijsonpip install ijsonimport ijson
def iter_huge_array(path):
with open(path, "rb") as f:
for item in ijson.items(f, "item"):
yield itemjson / orjson / ujson 선택json(표준 라이브러리): 호환성 최우선, 추가 의존성 없음orjson: 성능 민감 구간에서 유리ujson: 교체가 쉬운 편이지만 경계 케이스 검증 필요orjson 최소 예제:
import orjson
from datetime import datetime
data = {"name": "Alice", "now": datetime.now()}
raw = orjson.dumps(data) # bytes
obj = orjson.loads(raw)loads/dumps, 파일 처리에는 load/dumpensure_ascii=False 기본 적용모든 도구는 브라우저 로컬에서 실행되며, 입력 데이터는 서버로 업로드되지 않습니다.
개발자에게 최고의 JSON 처리 도구를 제공하는 데 전념
더 많은 게시물이 곧 출시됩니다...
블로그로 돌아가기업데이트 확인 방법, 다루는 주제, 제안 방법입니다.
이 블로그 목록을 북마크하고 홈·도구 허브의 가이드 영역도 확인하세요. 글 읽기에 가입이나 메일 구독이 필요 없습니다.
JSON 검증, 포맷, 변환, 디버깅 흐름과 JSON Work 업데이트이며, 사이트의 무료 브라우저 도구와 맞물립니다.
가능합니다. About 페이지나 GitHub로 연락 주세요. 실제 연동·디버깅에 도움이 되는 주제를 우선합니다.