← 전체 글

JSON의 잘못된 이스케이프 문자: 유효 이스케이프와 수정

JSON의 잘못된 이스케이프 문자는 백슬래시 뒤에 JSON이 허용하지 않는 것이 온다는 뜻. 유효 이스케이프 전체 목록과 \x, 경로, \u 수정 방법.

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 \x

JSON이 허용하는 이스케이프 전부

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 는 항상 올바른 쌍만 만들어 냅니다.

고치는 단계

  1. 보고된 위치로 이동 해서 무효한 문자 앞의 \ 를 찾으세요.
  2. 외톨이 백슬래시인가?(예: Windows 경로) —— \\ 로 두 번 쓰거나 슬래시로 바꾸세요.
  3. 외래 이스케이프인가 \x\' 같은? —— \xNN\u00NN 으로 바꾸고, ' 앞의 백슬래시는 지우세요.
  4. 짧은 \u 인가? —— 정확히 4자리 16진수가 되도록 채우세요.
  5. 최선의 수정: 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, 개행)가 그대로 들어 있는 경우입니다.

지금 고치기