해결)json.decoder.JSONDecodeError: Invalid \escape: line * column * (char *)



작성시간 :





(수정됨)

에러

에러 예시

from json import load
with open('seolpyo.txt', 'r') as txt:
    load(txt)
>> Traceback (most recent call last):
  File "c:\seolpyo\example.py", line 3, in <module> load(txt) File "C:\Program Files\Python311\Lib\json\__init__.py", line 293, in load
    return loads(fp.read(),
            ^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\json\decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
              ^^^^^^^^^^^^^^^^^^^^^^
json.decoder.JSONDecodeError: Invalid \escape: line 1 column 9 (char 8)

원인

예시로 만든 seolpyo.txt 파일에는 다음과 같은 내용의 텍스트가 json 형식으로 저장되어있다.

# seolpyo.txt
"escape \ \n 하얀설표"

여기서 문제가 되는 것은 "\(역슬래시 또는 백슬래시라 부름)"인데, 이것을 "\\"이나 "\n"과 같은 이스케이프 문자가 아니기 때문에 발생하는 오류이다.

해결방법

해결방법은 2가지로 나뉜다.

  1. json 형식으로 작성된 문자열이 아닌 경우
  2. json에서 인식할 수 없는 문자열이 섞여 있는 경우

이 글을 통해 2번에 해당하는 경우에 한정해서 문제 해결이 가능하다.
1번에 해당하는 문제는 json 형식으로 작성된 문자열은 json 포맷으로 변환하는 것은 잘못된 행동이므로 해결 방법 자체가 존재하지 않는다.

json에서 인식할 수 없는 문자열이 섞여있는 경우 해당 문자를 제거하거나, 올바르게 대체해주면 문제를 해결할 수 있다.

설명

우리나라의 경우 원화 단위를 표시하는 문자인 "₩" 문자가 백슬래시 "\"로도 표현이 가능하다.
이 탓인지 다양한 텍스트에서 "0원"이라는 문자 대신 "0\"을 쓰는 경우도 있고, 그냥 아무 이유 없이 백슬래시를 사용하는 경우도 있다.

가장 좋은 방법은 적절한 이스케이프 문자를 찾아 대체해주는 것이겠지만, 그 방법은 매우 복잡하다.
그 대신 다음과 같이 간단하게 문제를 해결하였다.

import json
# https://white.seolpyo.com/
with open('seolpyo.txt', 'r') as txt:
    seolpyo = txt.read()
    print(f'{seolpyo=}')
while 1:
    try:
        j: str = json.loads(seolpyo)
        break
    except json.decoder.JSONDecodeError as e:
        index = e.pos
        seolpyo = seolpyo[:index] + seolpyo[index+1:]
    except:
        raise
print(f'{j=}')
>> seolpyo='"escape \\ \\n 하얀설표"'
j='escape  \n 하얀설표'

json.decoder.JSONDecodeError

json 변환 중 문제가 발생하면 "json.decoder.JSONDecodeError"를 raise한다.
또한 문제가 발생한 문자열의 index를 "pos"라는 이름의 변수로 가지고 있는데, 이를 가져와 해당 문자를 문자열에서 제거한다.

이렇게 변경된 문자열을 다시 json으로 변환하고, 같은 문제가 발생하면 같은 작업을, json 디코더 에러가 아닌 다른 에러가 발생하면 raise해 무한 루프에 빠지지 않도록 했다.

이렇게 하면 원본에서 약간 변형된 결과를 얻게 되지만 json.decoder.JSONDecodeError를 해결하는 것이 가능하다.



태그



공유

하기






white.seolpyo.com