파이썬 중첩 JSON 파싱: 누락 키와 null을 안전하게 처리하기
중첩 JSON은 각 단계의 자료형을 확인한 뒤 필요한 키를 추출해야 합니다. .get()의 기본값은 키가 없을 때만 적용되므로, 값이 null인 응답까지 자동으로 안전해지는 것은 아닙니다.
누락 키와 null을 구분하세요
JSON 객체는 파이썬의 dict, 배열은 list, null은 None으로 변환됩니다. data.get("items", [])를 호출해도 실제 응답에 "items": null이 있으면 결과는 None입니다. 응답이 항상 같은 구조라는 가정을 코드로 확인해야 합니다.
실행 가능한 최소 예제
Python 3의 표준 라이브러리만 사용하는 예제입니다. 정상 객체, 누락 필드, null, 잘못된 행 형식을 한 데이터에 넣어 처리 경계를 확인합니다.
import json
payload = json.loads('''{"result": {"items": [
{"id": "A01", "name": "보고서"},
{"id": "A02", "name": null},
null,
{"name": "식별자 없음"}
]}}''')
def extract_items(data):
if not isinstance(data, dict):
raise ValueError("최상위 값은 객체여야 합니다")
result = data.get("result")
if not isinstance(result, dict):
raise ValueError("result 객체가 없습니다")
items = result.get("items")
if not isinstance(items, list):
raise ValueError("items는 배열이어야 합니다")
rows = []
for item in items:
if not isinstance(item, dict) or not item.get("id"):
continue
name = item.get("name")
rows.append({"id": item["id"], "name": name or "미입력"})
return rows
rows = extract_items(payload)
assert rows == [{"id": "A01", "name": "보고서"},
{"id": "A02", "name": "미입력"}]
print(rows)
이 예제의 결과는 식별자가 있는 두 행입니다. 빈 문자열과 null을 모두 “미입력”으로 바꾸는 것은 예제의 업무 규칙입니다. 두 값을 구분해야 하는 업무에서는 name is None 조건으로 분리하세요. 필수 필드 오류를 건너뛸지 전체 작업을 중단할지도 데이터의 목적에 따라 결정해야 합니다.
파싱 오류와 스키마 오류는 다릅니다
JSON 문법이 잘못되면 json.JSONDecodeError가 발생합니다. JSON 문법은 맞지만 items가 문자열인 경우는 애플리케이션의 구조 검증 문제입니다. 두 오류를 구분해 기록하면 외부 응답의 형식 변경을 찾기 쉽습니다.
대용량 파일은 어떻게 처리하나요?
표준 json.load()는 파싱된 객체를 메모리에 구성합니다. 필요한 메모리는 파일 크기와 객체 구조에 따라 달라집니다. 메모리 부족이 실제로 관찰되면 제공자의 페이지네이션이나 스트리밍 파서를 검토하세요. 재귀나 제너레이터를 사용한다는 이유만으로 특정 속도나 메모리 절감률을 보장할 수는 없습니다.
공식 자료: Python json 문서. 다음 단계: 결측치 처리 기준, SQLite 저장, 데이터 처리 가이드.
작성: 로그 · 2026-10-17 수정: null과 자료형 검증 예제를 추가하고 측정되지 않은 성능 수치를 제거했습니다.
댓글
댓글 쓰기