← 전체 글

JSON의 종료되지 않은 문자열: 원인과 수정

JSON에서 종료되지 않은 문자열은 여는 따옴표에 닫는 따옴표가 없다는 뜻 —— 보통은 이스케이프되지 않은 따옴표, 원시 개행, 잘린 데이터 때문. 깨진/고친 예시 포함.

SyntaxError: Unterminated string in JSON at position N 는 파서가 문자열을 읽기 시작했고(여는 " 를 봤음), 닫는 " 를 찾기 전에 입력의 끝 —— 또는 줄바꿈 —— 에 도달했다는 뜻입니다. 문자열이 닫히지 않았습니다. 원인과 해결법을 정리합니다.

어떤 문자열 에러를 만났나요?

에러는 어떻게 보이나

// V8 (Chrome / Node / Edge)
SyntaxError: Unterminated string in JSON at position 27

// Firefox
SyntaxError: JSON.parse: unterminated string at line 2 column 10 of the JSON data

// Safari
SyntaxError: JSON Parse error: Unterminated string

위치는 닫히지 않은 문자열의 여는 따옴표(또는 그 바로 뒤)를 가리킵니다 —— 거기서부터 앞으로 보세요.

왜 발생하는가

원인 1 —— 이스케이프되지 않은 따옴표가 문자열을 일찍 끝냄

값 안의 그냥 " 는 문자열을 일찍 닫습니다; 줄의 나머지는 예상치 못한 토큰으로 읽히고, 실제 문자열은 '열린 채' 남습니다.

// ❌ 깨짐 —— hello 앞의 따옴표가 "He said " 를 닫음
{ "note": "He said "hello" to her" }

// ✅ 수정 —— 내부 따옴표를 백슬래시로 이스케이프
{ "note": "He said \"hello\" to her" }

원인 2 —— 문자열 안의 원시 줄바꿈

JSON 문자열은 원시 줄바꿈을 가로지를 수 없습니다. 리터럴 줄바꿈은 문자열을 끊고 닫히지 않게 둡니다.

// ❌ 깨짐 —— 문자열 안에 실제 줄바꿈
{ "bio": "line one
line two" }

// ✅ 수정 —— \n 이스케이프 사용, 원시 줄바꿈 없음
{ "bio": "line one\nline two" }

원인 3 —— 데이터가 잘림

문자열 중간에서 끊긴 응답(연결 끊김, 버퍼/크기 한계, 부분 읽기)은 입력 끝에 문자열을 열어 둔 채로 남깁니다.

// 도착한 내용(연결이 끊김):
{"user":{"name":"Ada Lovel
// → Unterminated string

고치는 단계

  1. 보고된 위치로 가서 짝이 없는 여는 " 를 찾으세요.
  2. 값 안의 이스케이프되지 않은 " 를 찾아 \" 로 이스케이프하세요.
  3. 값 안의 원시 줄바꿈/탭을 찾아 \n / \t 로 바꾸세요.
  4. 잘림을 확인하세요 —— 바이트 길이를 Content-Length 와 비교; 짧다면 데이터가 잘린 것입니다(코드 수정 사안, 텍스트 수정 아님).
  5. JSON을 손으로 짜지 마세요. JSON.stringify() 가 따옴표와 제어 문자를 알아서 이스케이프해 줍니다.
// 예방: 문자열 연결로 JSON을 만들지 마세요
const json = JSON.stringify({ note: userInput }); // 항상 유효

자주 묻는 질문

'Unterminated string in JSON' 의 원인은?

여는 " 에 짝이 되는 닫는 " 가 없음 —— 보통은 값 안의 이스케이프되지 않은 따옴표, 원시 줄바꿈, 또는 문자열 중간에서 잘린 응답.

JSON 문자열 안에 따옴표나 줄바꿈을 어떻게 넣나요?

이스케이프하세요: 큰따옴표는 \", 개행은 \n, 탭은 \t. JSON.stringify() 로 JSON을 만들면 자동으로 처리됩니다.

'Unexpected end of JSON input' 과 같은가요?

관련은 있지만 다릅니다. 'Unterminated string' 은 문자열 이 열려 있다는 뜻; 'Unexpected end of JSON input' 은 구조 전체(객체/배열)가 일찍 끝났다는 뜻. 잘린 응답은 둘 다 유발할 수 있습니다.

지금 고치기