PC·모바일 문제 해결

자주 발생하는 JSON 오류: 쉼표, 따옴표와 Unexpected Token 해결하기

JSON이 invalid로 나오는 이유—끝 쉼표, 작은따옴표, 따옴표 없는 키, Unexpected token—을 고치고 JSON.parse가 실패하는 이유를 확인하세요.

바로 답

JSON 오류 대부분은 엄격한 문법 때문이다. 끝 쉼표, 작은따옴표, 따옴표 없는 속성 이름, 빠진 쉼표, 맞지 않는 괄호, 잘못된 이스케이프, 주석이 흔하다.

JSON은 JavaScript 객체와 비슷해 보이지만 더 엄격하다. 속성 이름과 문자열은 큰따옴표가 필요하다.

Unexpected token이 보이면, 표시된 문자는 파싱이 멈춘 위치일 수 있다. 원래 실수가 난 곳과 항상 같지는 않다.

JSON이 invalid라고 나온다. 파일 형식이 깨진 경우보다 작은 문법 실수가 많다. 아래 일곱 가지가 Unexpected token의 흔한 원인이다.

JSON은 왜 이렇게 잘 깨질까?

JSON은 문법이 엄격한 데이터 형식이다. JavaScript 객체 리터럴과 비슷해 보여도 그대로는 유효한 JSON이 아닐 수 있다. 표준 JSON에서는 속성 이름과 문자열에 큰따옴표가 필요하고, 끝 쉼표는 안 되며, 주석은 형식에 포함되지 않는다.

1. 끝 쉼표 (Trailing Commas)

마지막 속성 뒤의 쉼표가 문제다. 표준 JSON은 이를 허용하지 않는다.

잘못된 예

{
  "name": "Alex",
  "age": 30,
}

올바른 예

{
  "name": "Alex",
  "age": 30
}

배열도 같다. 마지막 항목 뒤의 쉼표를 뺀다.

잘못된 예

[
  "red",
  "green",
]

올바른 예

[
  "red",
  "green"
]

2. 큰따옴표 대신 작은따옴표

JavaScript는 작은따옴표를 자주 받는다. JSON은 그렇지 않다. 속성 이름과 문자열 값 모두 큰따옴표여야 한다.

잘못된 예

{
  'name': 'Alex'
}

올바른 예

{
  "name": "Alex"
}

3. 따옴표 없는 속성 이름

JavaScript에서는 name처럼 따옴표 없이 쓰는 경우가 있다. JSON에서는 모든 속성 이름을 큰따옴표 문자열로 감싸야 한다.

잘못된 예

{
  name: "Alex",
  age: 30
}

올바른 예

{
  "name": "Alex",
  "age": 30
}

4. 값 사이 쉼표 누락

속성과 배열 항목 사이에는 쉼표가 필요하다. 파서는 빠진 쉼표가 아니라 다음 따옴표나 괄호에서 Unexpected token을 보고할 수 있다.

잘못된 예

{
  "name": "Alex"
  "age": 30
}

올바른 예

{
  "name": "Alex",
  "age": 30
}

5. 대괄호·중괄호가 빠지거나 남는 경우

객체는 { }, 배열은 [ ]를 쓴다. 중첩 JSON에서는 ]가 빠지거나 }가 남거나 둘이 뒤바뀌면 실패한다. 여는 기호와 닫는 기호 짝을 센다.

잘못된 예

{
  "items": [1, 2
}

올바른 예

{
  "items": [1, 2]
}

6. 잘못된 이스케이프

JSON 문자열에서 백슬래시는 이스케이프를 시작한다. ", \, \n은 유효하다. Windows 경로를 C:\Users처럼 쓰면 \U는 합법적인 JSON 이스케이프가 아니다. 백슬래시를 두 번 쓰거나, 파서가 그 문자에서 멈춘다.

잘못된 예

{"file":"C:\Users\Alex"}

올바른 예

{"file":"C:\\Users\\Alex"}

7. JSON 안의 주석

표준 JSON에는 주석이 없다. 일부 설정 도구는 //나 /* */를 받는다(JSONC, JSON5 등). 그것은 표준 JSON이 아니며 JSON.parse는 거부한다.

잘못된 예

{
  // user name
  "name": "Alex"
}

Unexpected token은 무슨 뜻인가?

파서가 그 위치에서 허용되지 않는 문자를 만났다는 뜻이다. 표시된 지점은 읽기를 멈춘 곳이다. 앞에서 쉼표를 빠뜨리면 다음 속성의 따옴표에서 오류가 날 수 있다. 문장은 런타임마다 다르다. 모든 브라우저가 같은 문장을 출력한다고 보지 마라.

Unexpected end of JSON input은 무슨 뜻인가?

값이 끝나기 전에 텍스트가 끊긴 경우다. }나 ] 누락, 잘린 입력, 빈 본문, 중간에 끊긴 API 응답이 흔하다. 원인 하나로 단정하지 않는다.

JSON.parse()는 왜 실패하나?

JSON.parse()는 유효한 JSON 텍스트만 받는다. 아래는 성공한다:

const text = '{"name":"Alex"}';
const data = JSON.parse(text);

아래는 실패한다. 작은따옴표는 JSON이 아니다:

const text = "{'name':'Alex'}";
JSON.parse(text);

정확한 오류 문구는 JavaScript 런타임에 따라 다르다. 메시지는 힌트로 보고, 그 위치 근처의 쉼표·따옴표·괄호를 확인한다.

JSON은 JavaScript 객체와 같지 않다

JavaScript 객체 리터럴은 { name: 'Alex' }처럼 쓸 수 있다. 유효한 JSON은 { "name": "Alex" }처럼 큰따옴표 이름과 문자열, 끝 쉼표 없음, 주석 없음이어야 한다.

  • JSON 텍스트
  • 파서가 토큰을 읽음
  • 유효한 데이터 또는 Unexpected token
오류 표시는 파싱이 멈춘 지점이며, 실제 실수보다 뒤에 있을 수 있다.

JSON 오류를 빨리 찾는 방법

이 순서로 본다. 파일 전체를 다시 쓰지 말고 시작한다.

  1. validator로 JSON을 돌린다.
  2. 처음 보고된 오류를 읽는다.
  3. 보고된 위치보다 조금 앞을 본다.
  4. 쉼표를 확인한다. 끝 쉼표와 빠진 쉼표.
  5. 따옴표를 확인한다. 큰따옴표만.
  6. { }와 [ ] 짝을 맞춘다.
  7. 문자열의 백슬래시 이스케이프를 확인한다.
  8. strict JSON이 필요하면 주석을 제거한다.

흔한 수정의 빠른 표:

문제 수정
끝 쉼표마지막 항목 뒤 쉼표를 지운다.
작은따옴표이름과 문자열에 큰따옴표를 쓴다.
따옴표 없는 키속성 이름을 큰따옴표로 감싼다.
빠진 쉼표속성이나 배열 항목 사이에 쉼표를 넣는다.
빠진 괄호{ }와 [ ] 짝을 닫는다.
잘못된 이스케이프합법적인 이스케이프를 쓰거나 경로의 백슬래시를 두 번 쓴다.
주석표준 JSON이면 //와 /* */를 제거한다.

브라우저에서 JSON 검사하고 정리하기

NEXNARA JSON 정리·검사·비교로 이 기기에서 JSON을 확인할 수 있다.

검사, 2칸·4칸·탭으로 보기 좋게 정리, 한 줄로 압축(minify), 두 문서 비교(JSON Diff), .json 파일 열기가 가능하다. 파싱은 브라우저의 JSON.parse를 쓰며 eval은 쓰지 않는다.

5 MB보다 큰 문서는 느릴 수 있다. 15 MB보다 큰 텍스트는 브라우저에서 처리하지 않아 페이지가 멈추지 않게 한다.

JSON 처리 자체는 브라우저에서 이뤄진다. 이 도구에서는 텍스트를 NEXNARA 서버로 보내지 않는다. 광고와 다른 사이트 기능은 네트워크를 쓴다. 그건 처리와 별개다.

invalid JSON을 확인해 보려면 JSON 정리·검사·비교을 열고 텍스트를 붙여 넣으세요.

FAQ

JSON이 Unexpected token이라고 하는 이유는?

파서가 그 위치에서 허용되지 않는 문자를 만났습니다. 실제 실수—빠진 쉼표나 작은따옴표—는 그 바로 앞에 있을 수 있습니다.

JSON에서 끝 쉼표는 허용되나요?

아니요. 표준 JSON은 마지막 속성이나 배열 항목 뒤 쉼표를 허용하지 않습니다. JavaScript 객체 리터럴은 종종 허용합니다.

JSON에 작은따옴표를 쓸 수 있나요?

아니요. 속성 이름과 문자열은 큰따옴표여야 합니다.

JSON에 주석을 넣을 수 있나요?

표준 JSON에서는 안 됩니다. 일부 도구는 주석이 있는 JSONC나 JSON5를 받지만, JSON.parse는 거부합니다.

JSON.parse()는 왜 실패하나요?

문자열이 유효한 JSON이 아니기 때문입니다. 끝 쉼표, 작은따옴표, 따옴표 없는 키, 주석, 잘린 값이 흔합니다. 정확한 메시지는 런타임마다 다릅니다.

JSON이 유효한지 어떻게 확인하나요?

JSON 정리·검사·비교 같은 validator에 붙여 넣거나 콘솔에서 JSON.parse를 호출하세요. 예외가 나면 유효한 JSON이 아닙니다.