SyntaxError: Unexpected end of JSON input 는 JSON 구조가 완성되기 전에 파서가 문자열 끝에 도달했다는 뜻입니다. 데이터가 잘렸습니다. 이 글은 이 일이 발생하는 모든 흔한 방식과 각각의 정확한 해결법을 보여 줍니다.
이 에러의 의미
JSON.parse() 는 상태 기계입니다. 한 문자씩 읽으며 열린 대괄호, 중괄호, 문자열 구분자를 추적합니다. 입력 끝에 도달했는데 여전히 '무언가 안에' —— 객체, 배열, 문자열 —— 있으면 던집니다:
SyntaxError: Unexpected end of JSON input이 에러는 줄 번호나 위치를 주지 않습니다. 문제 자체가 내용의 부재 이기 때문 —— 가리킬 것이 없습니다.
원인 1 —— 잘린 API 응답
실세계에서 가장 흔한 원인. 서버가 큰 JSON 본문을 보냈는데 네트워크가 일찍 끊겼거나, 응답이 끝나기 전에 읽혔거나, 프록시·CDN 버퍼 제한에 걸린 경우.
// 도착한 것(응답 도중 연결 끊김):
'{"users":[{"id":1,"name":"Ada"},{"id":2,"na'
JSON.parse('{"users":[{"id":1,...') // SyntaxError: Unexpected end of JSON input수정: HTTP 상태 코드와 Content-Length 헤더를 확인하세요. 파싱 전에 원시 응답 길이를 로그로 남기세요. fetch 를 쓴다면 response.text() 를 읽어 수동으로 파싱하지 말고 항상 response.json() 을 await 하세요 —— 브라우저 내장 JSON 파서가 잘림에 대해 더 분명한 에러를 줍니다.
// 올바른 방법
const data = await response.json();
// 취약 —— 잘림 에러를 숨김
const text = await response.text();
const data = JSON.parse(text);원인 2 —— 닫히지 않은 객체나 배열
JSON 이 손으로 작성됐거나 닫는 대괄호·중괄호를 잊은 코드로 생성된 경우.
JSON.parse('{"name":"Ada","plan":"pro"')
// 닫는 } 누락
// SyntaxError: Unexpected end of JSON input
JSON.parse('[1, 2, 3')
// 닫는 ] 누락
// SyntaxError: Unexpected end of JSON input수정: JSON 린터를 쓰거나 문자열을 JSON Fix 에 붙이세요 —— 닫히지 않은 구분자를 찾고, 관대 모드에서는 빠진 괄호를 자동으로 채울 수 있습니다.
원인 3 —— 닫히지 않은 문자열
값 문자열이 닫는 큰따옴표로 끝나지 않음 —— 값 자체에 이스케이프되지 않은 큰따옴표가 있어서 일어나는 경우가 많음:
JSON.parse('{"title":"He said "hello" to her"}')
// ^ 이스케이프되지 않은 따옴표가 문자열을 일찍 종료
// SyntaxError: Unexpected end of JSON input
// 올바른 방법 —— 내부 따옴표를 백슬래시로 이스케이프:
JSON.parse('{"title":"He said \"hello\" to her"}')수정: 내부 큰따옴표를 \" 로 이스케이프하거나, 처음부터 JSON.stringify() 로 JSON 을 만들어 문자열을 손으로 짜지 마세요.
원인 4 —— 빈 문자열
빈 문자열이나 공백뿐인 문자열을 JSON.parse() 에 넘기면 같은 에러를 던집니다 —— 파싱할 입력 자체가 없습니다.
JSON.parse('') // SyntaxError: Unexpected end of JSON input
JSON.parse(' ') // SyntaxError: Unexpected end of JSON input
JSON.parse() // SyntaxError: Unexpected token u…(undefined 가 문자열로 캐스트)폼 필드, localStorage 키, 환경 변수가 비어 있을 때 자주 발생합니다.
// 파싱 전에 가드
const raw = localStorage.getItem('session');
if (!raw) return null;
return JSON.parse(raw);원인 5 —— 스트리밍 응답을 너무 일찍 읽음
스트리밍 API나 WebSocket을 소비할 때, 메시지가 다 도착하기 전에 청크를 파싱하려고 하기 쉽습니다.
// ❌ 불완전한 청크를 파싱 시도
ws.onmessage = (event) => {
const data = JSON.parse(event.data); // 부분일 수 있음
};
// ✓ 메시지 경계까지 버퍼링(애플리케이션 레벨 프레이밍)
let buffer = '';
ws.onmessage = (event) => {
buffer += event.data;
if (buffer.endsWith('\n')) { // 또는 알려진 구분자 확인
const data = JSON.parse(buffer.trim());
buffer = '';
}
};잘림 진단: Content-Length 와 스트리밍 리더
응답이 실제로 짧게 잘렸는지 확인하는 두 가지 구체적 기법:
Content-Length와 비교. 서버가 설정했다면 짧은 읽기를 직접 감지할 수 있음:const res = await fetch(url); const expected = Number(res.headers.get('Content-Length') ?? NaN); const text = await res.text(); if (Number.isFinite(expected) && text.length !== expected) { throw new Error(`truncated: got ${text.length} of ${expected} bytes`); }참고:
Content-Length는 청크 전송/압축 응답에서는 없을 수 있음.- 스트리밍 본문 리더로 읽기.
res.body.getReader()를 쓰면 청크 단위 도착을 관찰하고 스트림이 페이로드 도중에 닫히는 것을 알 수 있습니다 —— 연결 끊김이나 프록시 타임아웃의 증상이죠. 스트림이 중단되면 브라우저는fetch거부로 기저 네트워크 실패를 노출합니다; 파서 에러와 함께 보면 확실해집니다.
빠른 진단 체크리스트
- parse 호출 직전에
typeof input과input.length를 로그. - 길이가 너무 짧아 보이면 응답이 잘렸음 —— 네트워크 로그 확인.
- 길이가 0이면 소스(API, 저장소, 환경 변수)가 아무것도 안 돌려줌 —— 가드 추가.
- 길이가 맞아 보이면 문자열을 JSON Fix 에 붙여 구조 문제를 찾으세요.
프로덕션에서 우아하게 복구
function safeParse(text, fallback = null) {
if (!text || !text.trim()) return fallback;
try {
return JSON.parse(text);
} catch {
console.error('JSON parse failed, input length:', text.length);
return fallback;
}
}자주 묻는 질문
'Unexpected end of JSON input' 의 원인은?
파서가 객체, 배열, 또는 문자열 내부에 있는 상태로 문자열 끝에 도달함 —— 데이터가 불완전. 실세계에서 가장 흔한 원인은 잘린 API 응답; 그 외에는 닫히지 않은 괄호, 종료되지 않은 문자열, 빈 문자열.
왜 줄 번호나 위치가 없나요?
문제가 잘못된 문자가 아니라 누락된 내용이기 때문. 파서가 가리킬 것이 없습니 다 —— 구조가 닫히기 전에 입력이 동났을 뿐.
빈 문자열 경우 어떻게 고치나요?
파싱 전에 가드: if (!raw || !raw.trim()) return fallback;. 빈 폼 필드, 누락된 localStorage 키, 설정되지 않은 환경 변수가 흔한 원인.
프로덕션에서 우아하게 다루려면?
JSON.parse() 를 safeParse 헬퍼로 감싸 실패 시 fallback 을 돌리고(위 스니펫 참고), 잘림과 구조 결함을 구분할 수 있도록 입력 길이를 로그하세요. 패턴 전체는 JavaScript에서 깨진 JSON 다루기.
브라우저에서 잘린 JSON 수리
검사하거나 수리할 깨진 JSON 문자열이 있나요? JSON Fix 는 fixjson.org 에서 흔한 구조 오류(누락된 괄호 포함)를 파싱·검증·자동 수리합니다 —— 모두 브라우저에서, 어떤 서버로도 데이터 전송 없이.
- JSON Fix —— 유효하지 않은 JSON 수리·포맷
- '[object Object] is not valid JSON' 해결 —— JSON 문법 오류 종합 가이드
- Unexpected Token 에러 해설 —— 토큰 수준 파싱 에러 동반 가이드
- JavaScript에서 깨진 JSON 다루기 —— 모든 파싱 에러를 잡고 복구하는 패턴