Python/Debugging

JSONDecodeError: Expecting value: line 2 column 7 (char 8) / Expecting ',' delimiter 원인 및 해결법

jimmy_AI 2023. 9. 23. 14:51
반응형

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개가 아니라 하나만 나오면서 바깥쪽 딕셔너리가

온전히 선언이 완료되지 않아 발생한 에러로,

마지막 위치에 콤마(,)로 새로운 값 선언이 예상될 것으로 보였지만,

그대로 문자열이 종료되었기에 나타난 오류로 해석해볼 수 있습니다.

 

이 경우는 괄호 개폐 형태를 알맞게 맞춰주시면 해결될 수 있습니다.