Python CPython 3.14.3에서 파서를 실행해 확인했습니다.
Invalid \escape: line L column C (char N)
JSON 문자열 안의 백슬래시 뒤에 JSON의 아홉 가지 이스케이프 중 어느 것도 아닌 문자가 옵니다. 파이썬 코드에서는 혼란이 두 배가 됩니다. 파이썬 문자열 리터럴도 백슬래시를 소비하기 때문에, 파서에 도착하는 텍스트가 여러분이 입력한 것과 다릅니다.
JSON을 붙여넣고 어디서 깨지는지 정확히 확인하기
입력
붙여 넣은 것은 여러분의 브라우저를 떠나지 않습니다. connect-src 허용 목록 덕분에 이는 약속이 아니라 브라우저가 강제하는 보장입니다. 직접 확인하기
실제 원인
어느 쪽이 답인 경우가 많은지, 그 순서대로 정리했습니다.
-
01 윈도우 경로
백슬래시는 JSON을 위해 한 번 겹쳐야 하고, raw가 아닌 파이썬 리터럴 안에서는 파이썬을 위해 또 한 번 겹쳐야 합니다. raw 문자열을 쓰면 그중 한 겹이 사라집니다.
깨지는 예
json.loads('{"p": "C:\Users"}')되는 예
json.loads(r'{"p": "C:\\Users"}') -
02 정규식
\d, \s, \w는 JSON의 이스케이프가 아닙니다. 백슬래시를 모두 두 번 겹쳐 쓰세요.
-
03 \x 16진 이스케이프
JSON에는 \uXXXX뿐입니다. \x41은 \u0041이 되어야 합니다.
다른 런타임에서의 같은 실수
밑바탕의 문제는 똑같고, 다른 건 문구뿐입니다. 동료가 이 중 하나를 들고 왔다면, 그 사람이 보고 있는 건 여러분이 보는 것과 같습니다.
| JavaScript (V8) | Bad escaped character in JSON at position 9 (line 1 column 10) |
|---|
자주 묻는 질문
- 같은 문자열이 어디서는 되고 어디서는 안 되는 이유는?
- 문자열 리터럴을 몇 번 통과하느냐에 달렸습니다. .json 파일에 바로 쓴 경로라면 겹치기가 한 단계면 됩니다. 같은 경로가 파이썬 리터럴 안에 있고 그게 다시 셸 인자 안에 있다면 세 단계가 필요할 수도 있습니다.
- 잘못된 이스케이프 시퀀스에 대한 SyntaxWarning과 같은 건가요?
- 다릅니다. 그리고 헷갈리기 쉽습니다. 그 경고는 JSON이 끼어들기 전 단계에서 파이썬이 여러분의 소스 코드를 두고 하는 불평입니다. 이 오류는 JSON 파서가 내는 것이고 문자열의 내용에 관한 것입니다.