AI 응답을 Python 자동화에 넘길 때는 JSON 문법만 맞는지 확인하면 부족합니다. 먼저 JSON 파싱을 통과시킨 뒤 최상위 값이 dict인지, 필수 key가 있는지, 각 값의 타입이 맞는지 확인하고 하나라도 실패하면 다음 자동화 단계로 넘기지 않아야 합니다.
JSON 파싱 오류와 구조 오류는 다릅니다
JSON 문법 오류와 구조 오류는 다릅니다. json.loads()가 실패하면 문법 문제이고, 파싱 후 필수 key나 타입 검사가 실패하면 업무 구조 문제입니다.
예를 들어 응답이 {"title": "요약"}처럼 문법상 JSON이어도 자동화가 content와 tags를 필요로 한다면 다음 단계에서 사용할 수 없습니다. 반대로 따옴표가 닫히지 않은 응답은 구조를 확인하기 전에 파싱부터 실패합니다.
검증 순서는 세 단계로 고정합니다
json.loads()로 문자열을 Python 객체로 바꿉니다. 유효하지 않은 JSON이면JSONDecodeError를 잡고 중단합니다.- 최상위 값이
dict인지 확인합니다. 목록이나 문자열이면 현재 자동화가 기대하는 객체 구조가 아닙니다. - 필수 key가 모두 있고 값의 타입이 맞는지 확인합니다. 키가 있어도
title이 문자열이 아니거나tags가 목록이 아니면 통과시키지 않습니다.
최소 검증 코드를 먼저 만듭니다
import json
from typing import Any
def parse_ai_result(raw: str) -> dict[str, Any] | None:
try:
value = json.loads(raw)
except json.JSONDecodeError:
return None
if not isinstance(value, dict):
return None
if not isinstance(value.get("title"), str):
return None
if not isinstance(value.get("content"), str):
return None
if not isinstance(value.get("tags"), list):
return None
return value
mock_response = '{"title": "요약", "content": "본문", "tags": ["python"]}'
validated = parse_ai_result(mock_response)
print(validated is not None)
이 예시의 출력은 True입니다. 이 값은 외부 AI API를 호출한 결과가 아니라 코드에 넣은 mock 응답을 프로젝트 .venv에서 실행한 결과입니다.
json.loads()는 문자열·bytes·bytearray에 담긴 JSON 문서를 Python 객체로 역직렬화하고, 유효한 JSON 문서가 아니면 JSONDecodeError가 발생합니다. isinstance()는 객체가 지정한 클래스 또는 그 하위 클래스의 인스턴스인지 확인합니다. 따라서 파싱 성공과 업무 구조 통과를 별도 조건으로 둘 수 있습니다.
실패하면 다음 작업을 호출하지 않습니다
세 검사를 모두 통과한 경우에만 다음 자동화 단계로 넘기고, 하나라도 실패하면 재처리나 수동 확인으로 돌립니다. 검증 함수가 False를 반환하면 API 전송·파일 저장·게시 같은 다음 작업을 호출하지 않도록 흐름을 끊을 수 있습니다.
이 기준은 “JSON처럼 보인다”가 아니라, 다음 코드가 기대하는 구조를 통과했는지입니다. 파싱 실패와 구조 실패를 나누면 재시도할 문제와 입력 형식을 고칠 문제를 구분할 수 있습니다.
파싱 실패와 구조 실패를 나누면 재시도할 문제와 입력 형식을 고칠 문제를 구분할 수 있습니다. 검증 함수가 False를 반환하면 API 전송·파일 저장·게시 같은 다음 작업을 호출하지 않도록 흐름을 끊을 수 있습니다.
이 글의 기준은 “JSON처럼 보인다”가 아니라, 다음 코드가 기대하는 구조를 통과했는지입니다.
실제 API 연결 전에 확인할 것
실제 API 응답을 연결할 때도 먼저 응답 본문을 문자열로 받고, 같은 검증 함수를 통과한 뒤 저장·전송 단계로 넘기는 흐름을 유지하세요. 필수 key가 바뀌거나 새 값이 추가되는 경우에는 검증 함수와 테스트용 mock 응답을 함께 수정하면 됩니다.