JSON(JavaScript Object Notation)은 여러 컴퓨터 프로그램 사이에서 데이터를 쉽게 주고받기 위해 널리 사용되는 텍스트 기반 데이터 교환 형식입니다. JSON에는 명확한 문법 규칙이 있으며, 파이썬(Python)은 이러한 형식이 올바른지 검증할 수 있습니다. 이번 글에서는 하나의 문자열을 대상으로 json 모듈을 활용해 해당 문자열이 유효한 JSON 형식인지 확인하는 방법을 알아보겠습니다.
json.loads()로 JSON 객체 생성 및 유효성 검사
파이썬의 json 모듈에는 loads()라는 메서드가 포함되어 있습니다. 이 메서드는 유효한 JSON 문자열을 읽어 들여 파이썬 딕셔너리 객체로 변환해 줍니다. 따라서 문자열을 loads()에 전달했을 때 아무 오류 없이 로딩되면 그 문자열은 유효한 JSON이라고 판단할 수 있고, ValueError가 발생하면 잘못된 JSON 형식으로 처리하면 됩니다.
참고로 파이썬 3.5 이상에서는 실제로 ValueError의 하위 클래스인 json.JSONDecodeError가 발생하므로, except 절에 json.JSONDecodeError를 명시적으로 작성하는 것이 더 좋은 습관입니다.
예제 코드
아래 예제에서는 세 가지 경우를 테스트합니다. 첫 번째는 정상적인 JSON 문자열, 두 번째는 값에 따옴표가 빠져 형식이 어긋난 문자열, 세 번째는 중첩(nested) 구조를 가진 JSON입니다.
import json
Astring = '{"Mon" : "2pm", "Wed" : "9pm", "Fri" : "6pm"}'
# 주어진 문자열
print("Given string", Astring)
# JSON 유효성 검사
try:
json_obj = json.loads(Astring)
print("A valid JSON")
except ValueError as e:
print("Not a valid JSON")
# 다시 확인 - 잘못된 형식의 문자열
Astring = '{"Mon" : 2pm, "Wed" : "9pm", "Fri" : "6pm"}'
print("Given string", Astring)
try:
json_obj = json.loads(Astring)
print("A valid JSON")
except ValueError as e:
print("Not a valid JSON")
# 중첩 구조를 가진 JSON
Astring = '{ "Timetable": {"Mon" : "2pm", "Wed" : "9pm"}}'
print("Given string", Astring)
try:
json_obj = json.loads(Astring)
print("A valid JSON")
except ValueError as e:
print("Not a valid JSON")실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Given string {"Mon" : "2pm", "Wed" : "9pm", "Fri" : "6pm"}
A valid JSON
Given string {"Mon" : 2pm, "Wed" : "9pm", "Fri" : "6pm"}
Not a valid JSON
Given string { "Timetable": {"Mon" : "2pm", "Wed" : "9pm"}}
A valid JSON정리
두 번째 예제처럼 값에 따옴표가 없으면("Mon" : 2pm) JSON 문법 위반으로 간주되어 유효성 검사에 실패하지만, 중첩 구조의 JSON 역시 올바른 형식이라면 문제없이 통과됩니다. 이처럼 json.loads()를 try-except 블록으로 감싸면 외부 라이브러리 없이 표준 라이브러리만으로 문자열의 JSON 유효성을 간편하게 검사할 수 있습니다. 특히 API 응답이나 설정 파일처럼 외부에서 입력받은 데이터를 처리하기 전에 이 방법을 활용하면 형식 오류로 인한 예외 상황을 미리 방지할 수 있습니다.