상세 컨텐츠

본문 제목

Python json.loads 중복 키 검출하기: object_pairs_hook로 입력 거절

AI 활용

by 오픈시드 2026. 10. 13. 11:59

본문

반응형

JSON 중복 키, 금액이 바뀌기 전에 확인
같은 키가 겹치는 상황을 표현한 AI 생성 표지입니다.

Python의 json.loads()는 같은 객체에 같은 키가 두 번 있어도 기본 설정에서는 오류를 내지 않고 마지막 값만 남깁니다. 중복을 발견했을 때 입력을 거절하려면 object_pairs_hook에 검사 함수를 넣으세요. 아래 코드는 가상의 금액 JSON으로 기본 결과와 검사 실패를 바로 비교합니다.

준비물은 Python과 표준 라이브러리 json뿐이며 추가 설치는 없습니다. 2026년 10월 13일 CPython 3.12.14에서 직접 실행했고, 동작 설명은 Python 3.13 공식 문서와 대조했습니다. 다른 버전·라이브러리는 사용 환경에서 확인하세요.

같은 금액 키를 두 번 넣으면

{"총액":10000,"총액":100000}을 기본 방식으로 읽으면 결과는 {'총액': 100000}입니다. 앞의 10000은 결과 딕셔너리에 남지 않습니다. 실제 주문이나 AI의 출력 기록이 아닌, 차이를 확인하려고 만든 합성 예시입니다.

이 동작은 Python 공식 문서의 Repeated Names Within an Object에 명시돼 있습니다. JSON 표준인 RFC 8259 §4는 한 객체 안의 이름이 유일해야 한다고 권고하지만, 중복을 받은 모든 구현이 같은 결과를 낸다고 보장하지 않습니다.

Python 공식 중복키 코드 예제: 같은 키 x의 마지막 값 3만 남는 결과
공식 중복키 코드 예제: Python Software Foundation, Python 문서 3.13.16, Repeated Names Within an Object. 2026-10-13 확인.

문서 코드의 0BSD 라이선스로 이용한 공식 예제이며, 아래의 직접 실행 결과와 구분한 참고 자료입니다.

복사해서 중복 검사를 실행하기

아래 코드를 duplicate_check.py로 저장한 뒤 터미널에서 python duplicate_check.py로 실행하세요. 환경에 따라 명령 이름은 python3입니다.

import json


def reject_duplicate_keys(pairs):
    data = {}
    for key, value in pairs:
        if key in data:
            raise ValueError(f"중복 키: {key}")
        data[key] = value
    return data


raw = '{"총액":10000,"총액":100000}'
print("기본 결과:", json.loads(raw))

try:
    result = json.loads(raw, object_pairs_hook=reject_duplicate_keys)
except ValueError as error:
    print("검사 실패:", error)
else:
    print("검사 통과:", result)

실행 결과는 다음과 같습니다.

기본 결과: {'총액': 100000}
검사 실패: 중복 키: 총액

두 번째 줄은 앞서 작성한 검사 함수가 ValueError를 일으켜 해당 입력을 거절했다는 뜻입니다. 예제에서는 결과를 보여주려고 예외를 잡아 출력했습니다. 실제 처리 코드에서는 이 실패 건을 정상 저장 단계로 넘기지 않아야 합니다.

object_pairs_hook는 각 객체의 이름·값 쌍 목록을 함수에 전달합니다. 중복 정보가 딕셔너리에서 사라지기 전에 검사하는 방식입니다. 중첩 객체에도 적용되며, 같은 객체에서 같은 값으로 키를 반복해도 거절합니다. 서로 다른 객체에 총액이 하나씩 있는 것은 허용합니다.

정상 입력과 비교해서 확인하기

위 코드의 raw 한 줄만 다음으로 바꿔 다시 실행하세요.

raw = '{"총액":10000,"배송비":3000}'

이번에는 두 번째 줄이 다음처럼 나옵니다.

검사 통과: {'총액': 10000, '배송비': 3000}

통과는 이 검사에서 중복 키를 발견하지 않았다는 뜻입니다. 총액이 필수인지, 숫자인지, 배송비를 포함한 합계가 맞는지는 별도 규칙으로 확인해야 합니다. 이미 딕셔너리로 변환한 데이터에서는 앞서 사라진 중복을 복원할 수 없으므로 원본 JSON 문자열을 읽는 단계에 검사를 넣으세요.

먼저 위의 중복 입력과 정상 입력을 각각 실행해 두 결과가 구분되는지 확인해 보세요.

반응형

관련글 더보기