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

작성자: [관리자] 하얀설표

2023.06.29 10:28 (KST) 작성됨

2024.04.22 14:04 (KST) 수정됨






(2024.04.22) 수정됨.

에러

에러 예시

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를 해결하는 것이 가능하다.

 






추천 (0)


글 목록

댓글을 달 수 없는 게시물입니다.


"분류없음" 카테고리의 #Python, #에러해결 관련 게시물

분류없음
예제)특정 조합이 리스트 요소에 반드시 포함되어야 한다는 사실만 알 때의 조건식
수정 08.20 | [관리자] 하얀설표
👍 0
#Python, #예제
🗨️ 0
썸네일
분류없음
주식시장 개장일과 휴장일 정보를 간단하게 가져오는 방법(엑셀, 파이썬)
수정 07.20 | [관리자] 하얀설표
👍 0
#Python, #주식
🗨️ 0
분류없음
해결) 장고 bulk_update의 메모리 누수 문제(django orm bluk_update method memory leak)
수정 07.12 | [관리자] 하얀설표
👍 0
#Python, #Django
🗨️ 0
분류없음
해결) django.db.utils.OperationalError: database is locked
수정 06.18 | [관리자] 하얀설표
👍 0
#Python, #에러해결, #Django
🗨️ 0
분류없음
악성 크롤러를 괴롭히는 방법
수정 05.18 | [관리자] 하얀설표
👍 0
#Python, #Django
🗨️ 0
분류없음
장고) 모든 방문자에게 세션 부여하기(anonymous user session)
수정 05.15 | [관리자] 하얀설표
👍 0
#Python, #Django
🗨️ 0
썸네일
분류없음
한국거래소의 수정주가 계산 공식을 알아보자
수정 05.10 | [관리자] 하얀설표
👍 0
#Python, #주식
🗨️ 0
썸네일
분류없음
파이썬으로 연속 조회가 가능한 주식 차트 만들기(tkinter, seolpyo-mplchart)
수정 05.08 | [관리자] 하얀설표
👍 0
#Python
🗨️ 0
썸네일
분류없음
seolpyo-mplchart document
수정 05.08 | [관리자] 하얀설표
👍 0
#Python
🗨️ 0
썸네일
분류없음
seolpyo_mplchart 사용 설명서
수정 05.08 | [관리자] 하얀설표
👍 0
#Python
🗨️ 0