Python으로 json 문자열 파싱 과정을 수행할 때 자주 발생하는 오류 케이스인
JSONDecodeError에 대하여 발생 원인과 해결 방법을 간략하게 정리해 보겠습니다.
정상적인 json 파싱 케이스
아래와 같이 정상적인 json 양식으로 저장된 문자열을 가정해 보겠습니다.
txt = '{"a" : "123", "b" : {"c" : "456"}}'
이런 정상적인 양식의 문자열의 경우,
json 모듈의 loads 메서드를 통하여 쉽게 파싱을 진행할 수 있습니다.
import json
txt_dict = json.loads(txt)
print(txt_dict['b']['c']) # 456
오류 케이스 1: 딕셔너리 규칙이 지켜지지 않은 경우
json에서는 {}로 딕셔너리 자료형 시작과 끝을 표현하고, :로 key와 value 사이를 구분하며,
콤마(,)로 다음 key로 넘어가게 되며, 중간의 문자열이나 숫자 등은 올바르게 선언되어야 합니다.
이러한 딕셔너리 규칙이 제대로 지켜지지 않은 경우, 자료 형태의 기준이 모호하여
오류가 발생할 수 있습니다.
아래는 json 딕셔너리 규칙이 제대로 지켜지지 않은 문자열 예시입니다.
txt_err = '{\n"a" : <"b" : "456">\n}'
print(txt_err)
{
"a" : <"b" : "456"> # value 부분이 딕셔너리 규칙을 깸
}
위 코드를 loads 메서드로 파싱하려고 시도하면 아래와 같은 오류가 발생하게 됩니다.
json.loads(txt_err) # JSONDecodeError: Expecting value: line 2 column 7 (char 8)
즉, 2번째 줄의 7번 인덱스 위치인 <에서 value로써
문자열이나 숫자가 아닌 값이 중간에 난입했기에 딕셔너리 규칙이 깨져 오류가 발생하였습니다.
이런 경우는, 딕셔너리 선언 규칙이 제대로 지켜지도록 문자열을 수정해주시면 됩니다.
(위의 케이스에서는 <>를 {}로 바꿔주면 새로운 딕셔너리가 value가 되면서 해결됩니다.)
(그리고, 리스트 규칙도 유사한 원리로 지켜져야 합니다.)
오류 케이스 2: 괄호 여닫음이 알맞지 않은 경우
괄호의 열고 닫음이 제대로 작성되지 않은 경우에서도 유사한 오류가 발생할 수 있습니다.
위의 정상 케이스에서 닫기 괄호인 }가 1개 생략된 경우를 살펴보도록 하겠습니다.
txt_err2 = '{"a" : "123", "b" : {"c" : "456"}' # 닫기 괄호 1개가 생략됨
이 경우에서도 loads 메서드로 파싱을 시도하면 비슷한 오류가 발생합니다.
json.loads(txt_err2) # JSONDecodeError: Expecting ',' delimiter: line 1 column 34 (char 33)
닫기 괄호가 마지막 부분에 2개가 아니라 하나만 나오면서 바깥쪽 딕셔너리가
온전히 선언이 완료되지 않아 발생한 에러로,
마지막 위치에 콤마(,)로 새로운 값 선언이 예상될 것으로 보였지만,
그대로 문자열이 종료되었기에 나타난 오류로 해석해볼 수 있습니다.
이 경우는 괄호 개폐 형태를 알맞게 맞춰주시면 해결될 수 있습니다.