SyntaxError: Bad escaped character in JSON at position N 는 문자열 안의 백슬래시(\) 뒤에 JSON이 알지 못하는 문자가 따라온다는 뜻입니다. JSON은 정해진 작은 이스케이프 집합만 허용합니다 —— 백슬래시 뒤에 그 외의 것이 오면 이 에러가 발생합니다. 전체 목록과 고치는 방법을 정리합니다.
어떤 문자열 에러를 만났나요?
- Bad escaped character ——
\뒤에 JSON이 허용하지 않는 것이 옴(예:\x, Windows 경로). - Bad control character —— 이스케이프되지 않은 원시 tab/개행/null 바이트가 문자열 안에 그대로 들어 있음.
- Unterminated string ——
"로 시작한 문자열이 닫히지 않음.
에러는 어떻게 보이나
// V8 (Chrome / Node / Edge)
SyntaxError: Bad escaped character in JSON at position 14
// Firefox
SyntaxError: JSON.parse: bad escaped character at line 1 column 15 of the JSON data
// Safari
SyntaxError: JSON Parse error: Invalid escape character \xJSON이 허용하는 이스케이프 전부
JSON 문자열 안에서 백슬래시 다음에 올 수 있는 것은 다음 중 하나뿐입니다:
\" 큰따옴표
\\ 백슬래시
\/ 슬래시
\b 백스페이스
\f 폼피드
\n 개행
\r 캐리지 리턴
\t 탭
\uXXXX 유니코드 코드포인트(정확히 4자리 16진수) \ 뒤에 그 외의 것 —— \x, \', \a, \0, \Users 같은 Windows 경로, 혹은 잘린 \u12 —— 가 오면 모두 'bad escaped character'가 됩니다.
왜 발생하는가
원인 1 —— 다른 언어의 이스케이프를 가져옴
// ❌ \x 와 \' 는 JS/Python에서는 유효하지만 JSON에서는 무효
{ "code": "\x1b[0m", "name": "O\'Brien" }
// ✅ 그 바이트에는 \u 이스케이프를 쓰고, 작은따옴표는 이스케이프하지 않는다
{ "code": "\u001b[0m", "name": "O'Brien" }원인 2 —— Windows 파일 경로
// ❌ 각 백슬래시가 무효한 이스케이프를 시작
{ "path": "C:\Users\Ada\file.json" }
// ✅ 모든 백슬래시를 이스케이프(또는 슬래시 사용)
{ "path": "C:\\Users\\Ada\\file.json" }
{ "path": "C:/Users/Ada/file.json" }원인 3 —— 잘리거나 망가진 \u 이스케이프
// ❌ \u 는 정확히 4자리 16진수가 필요
{ "char": "\u12" }
// ✅
{ "char": "\u0012" }서로게이트 쌍과 BMP 이외 문자
JSON의 \uXXXX 이스케이프는 4자리 16진수로 고정되어 있고, 표현 가능한 코드포인트는 U+FFFF(기 본 다국어 평면 BMP)까지입니다. 그 이상의 문자 —— 이모지, 많은 CJK 확장, 수학 기호 —— 는 UTF-16 서로게이트 쌍 으로 적어야 합니다:
// 😀 (U+1F600) 을 서로게이트 쌍으로
"\uD83D\uDE00"
// 허용되지 않음 —— JSON에는 \U 도 \u{...} 도 없다
"\u1F600" // 잘못된 이스케이프(앞 4자리만 소비되고 나머지는 일반 텍스트)
"\u{1F600}" // 잘못된 이스케이프파일 자체는 디스크에서 UTF-8이지만, 이는 JSON이 이스케이프 안에서는 UTF-16 형식으로 인코딩하기 때문입니다. 실용적인 영향이 두 가지 있습니다:
- 파일 안의 UTF-8은 문제없다.
"😀"를 그대로 적어도 됩니다. 현대 파서는 처리합니다. 서로게이트 쌍 형식은 반드시 이스케이프해야 할 때만 필요합니다. - 고립된 서로게이트 주의.
\uD83D뒤에 짝이 되는 하위 서로게이트가 없거나 그 반대인 경우, JSON 명세상으로는 허용되지만 UTF-16으로는 잘못된 형태입니다 —— 하류의 소비자(특히 Postgres의jsonb)는 거부합니다.JSON.stringify는 항상 올바른 쌍만 만들어 냅니다.
고치는 단계
- 보고된 위치로 이동 해서 무효한 문자 앞의
\를 찾으세요. - 외톨이 백슬래시인가?(예: Windows 경로) ——
\\로 두 번 쓰거나 슬래시로 바꾸세요. - 외래 이스케이프인가
\x나\'같은? ——\xNN을\u00NN으로 바꾸고,'앞의 백슬래시는 지우세요. - 짧은
\u인가? —— 정확히 4자리 16진수가 되도록 채우세요. - 최선의 수정:
JSON.stringify()로 JSON을 만드세요. 유효한 이스케이프만 생성합니다.
// 예방 —— 이스케이프가 자동으로 올바름
JSON.stringify({ path: 'C:\\Users\\Ada', code: '\x1b[0m' });
// → {"path":"C:\\Users\\Ada","code":"\u001b[0m"}자주 묻는 질문
'Bad escaped character in JSON' 이 무슨 뜻인가요?
문자열 안의 백슬래시 뒤에 JSON이 허용하는 이스케이프(" \\ / b f n r t 또는 \uXXXX) 외의 문자가 옵니다. 흔한 범인은 \x, \', 그리고 이스케이프되지 않은 Windows 경로입니다.
JSON에 Windows 경로를 어떻게 적나요?
모든 백슬래시를 두 배로(C:\\\\Users) 만들어 각각 유효한 \\ 이스케이프가 되게 하거나, JSON이 받아들이는 슬래시(C:/Users)를 쓰세요.
이건 'Bad control character' 와 같은 건가요?
아니요. 'Bad escaped character' 는 백슬래시 뒤의 잘못된 시퀀스에 대한 것입니다. 'bad control character' 는 백슬래시 없이 이스케이프되지 않은 원시 제어 바이트(tab, 개행)가 그대로 들어 있는 경우입니다.
지금 고치기
- JSON Fix —— 브라우저에서 유효하지 않은 이스케이프를 찾아 수정
- JSON 문자열 안의 Bad Control Character —— 원시 제어 바이트와 이스케이프의 차이
- JSON의 종료되지 않은 문자열 —— 문자열이 닫히지 않은 경우
- JSON.parse 의 Unexpected Token 에러 해결법 —— 더 폭넓은 에러 가이드