튜토리얼

Python JSON 실전 가이드: 읽기, 쓰기, 검증, 변환

Python 표준 라이브러리로 JSON을 안전하게 읽고 쓰며 오류 처리, 숫자 정밀도, 데이터 변환, CLI 디버깅까지 다루는 실무 가이드입니다.

2026-07-2911분

Python 내장 json 모듈은 API 샘플, 설정 파일, 데이터 변환의 대부분을 처리할 수 있습니다. 실무에서는 인코딩, 오류 위치, 숫자 정밀도, 입력 구조를 명확히 다루는 것이 중요합니다.

파싱 오류 위치 기록하기

import json

raw = '{"name": "Ada", "active": true}'

try:
    data = json.loads(raw)
except json.JSONDecodeError as exc:
    print(f"Invalid JSON: line {exc.lineno}, column {exc.colno}: {exc.msg}")
    raise

로그에는 줄과 열, 요청 ID만 남기고 비밀 정보가 들어 있는 전체 본문은 기록하지 마세요. 운영 수집 과정에서 입력을 조용히 수정한 뒤 계속 처리하는 것도 피해야 합니다.

UTF-8 파일 읽기와 쓰기

import json
from pathlib import Path

source = Path("input.json")
target = Path("output.json")

with source.open("r", encoding="utf-8") as handle:
    data = json.load(handle)

with target.open("w", encoding="utf-8") as handle:
    json.dump(data, handle, ensure_ascii=False, indent=2)
    handle.write("\n")

중요한 설정은 임시 파일에 먼저 쓰고 성공한 뒤 대상 파일을 교체하면 중간에 깨진 파일이 남는 위험을 줄일 수 있습니다.

필요한 경우 십진 정밀도 유지하기

import json
from decimal import Decimal

payload = json.loads('{"amount": 19.99}', parse_float=Decimal)
print(payload["amount"] * 3)

Decimal은 기본적으로 JSON 직렬화가 되지 않습니다. 외부 계약이 십진 문자열을 사용하는지, 최소 통화 단위 정수를 사용하는지 결정한 뒤 명시적으로 변환하세요.

변환 전에 구조 확인하기

def normalize_users(value):
    if not isinstance(value, list):
        raise ValueError("Root must be an array")

    result = []
    for index, item in enumerate(value):
        if not isinstance(item, dict):
            raise ValueError(f"Item {index} must be an object")
        if "id" not in item or "email" not in item:
            raise ValueError(f"Item {index} is missing id or email")
        result.append({
            "id": str(item["id"]),
            "email": str(item["email"]).strip().lower(),
        })
    return result

복잡한 계약에는 JSON Schema와 유지 관리되는 검증 라이브러리를 사용하세요. 문법 검증과 계약 검증은 서로 다른 문제입니다.

변환 규칙을 명확히 하기

중첩 JSON을 CSV나 데이터베이스 행으로 바꿀 때 배열, 누락, null을 어떻게 표현할지 먼저 정의해야 합니다.

def order_row(order):
    customer = order.get("customer") or {}
    return {
        "order_id": order.get("id"),
        "customer_email": customer.get("email"),
        "item_count": len(order.get("items") or []),
        "status": order.get("status", "unknown"),
    }

입력과 기대 출력을 테스트로 남기면 변환 결정이 문서화됩니다.

명령줄로 빠르게 확인하기

python -m json.tool input.json
python -m json.tool --sort-keys input.json

시각적으로 확인하려면 JSON Beautifier 또는 JSON Tree Viewer를 사용할 수 있습니다. 불필요한 비밀 정보는 먼저 제거하세요.

운영 체크리스트

  • • UTF-8을 명시합니다.
  • • 입력 크기와 중첩 깊이를 제한합니다.
  • • 누락과 명시적 null을 구분합니다.
  • • 정밀도가 필요한 숫자는 Decimal, 문자열, 최소 단위 정수로 처리합니다.
  • • 변환 전에 구조를 검증합니다.
  • • 빈 배열, Unicode, 큰 정수, 잘못된 JSON을 테스트합니다.

전체 옵션은 Python 공식 json 문서에서 확인할 수 있습니다. 표준 라이브러리로 시작하고 계약에 필요할 때 Schema 검증을 추가하세요.

Ene Chen

개발자에게 최고의 JSON 처리 도구를 제공하는 데 전념

관련 게시물

더 많은 게시물이 곧 출시됩니다...

블로그로 돌아가기

관련 도구

자주 묻는 질문

업데이트 확인 방법, 다루는 주제, 제안 방법입니다.

새 글을 빠르게 보려면?

이 블로그 목록을 북마크하고 홈·도구 허브의 가이드 영역도 확인하세요. 글 읽기에 가입이나 메일 구독이 필요 없습니다.

어떤 주제를 다루나요?

JSON 검증, 포맷, 변환, 디버깅 흐름과 JSON Work 업데이트이며, 사이트의 무료 브라우저 도구와 맞물립니다.

튜토리얼 주제를 제안할 수 있나요?

가능합니다. About 페이지나 GitHub로 연락 주세요. 실제 연동·디버깅에 도움이 되는 주제를 우선합니다.