본문으로 건너뛰기
ZEKILO Dev
포맷

JSON 오류 7가지와 고치는 법 — 끝 쉼표·따옴표·주석

2026.10.03 업데이트 · 4분 읽기

JSON 파싱 오류는 대부분 끝 쉼표, 작은따옴표, 따옴표 없는 키, 주석, 닫지 않은 괄호, NaN·undefined, 중복 키에서 나옵니다. 원인과 고치는 방법을 RFC 8259 기준으로 정리했습니다.

JSON 포맷터·검증 바로 사용하기

JSON 파싱이 실패하는 원인은 대부분 정해져 있습니다. JavaScript 코드에서는 되지만 JSON 표준(RFC 8259)에는 없는 문법을 썼기 때문입니다. 오류가 난 JSON을 JSON 포맷터·검증에 붙여 넣으면 몇 번째 줄, 몇 번째 열에서 무엇이 잘못됐는지 바로 볼 수 있습니다. 아래 일곱 가지만 알아 두면 대부분은 직접 고칠 수 있습니다.

한눈에 보기

번호 오류 잘못된 예 고친 예
1 끝 쉼표 {"a":1,} {"a":1}
2 작은따옴표 {'a':1} {"a":1}
3 따옴표 없는 키 {a:1} {"a":1}
4 주석 // x 주석을 지움
5 닫지 않은 괄호 {"a":[1,2} {"a":[1,2]}
6 NaN·Infinity·undefined {"a":NaN} {"a":null}
7 중복 키 {"a":1,"a":2} {"a":2}

1~6번은 문법 오류라 파서가 읽기를 멈춥니다. 7번은 오류 없이 읽히지만 결과가 파서마다 다를 수 있습니다.

문법 오류 여섯 가지

1. 끝 쉼표

RFC 8259의 문법에서 쉼표는 항목과 항목 사이에만 올 수 있습니다. JavaScript나 Python 코드에서는 마지막 항목 뒤에 쉼표를 남겨도 되기 때문에, 손으로 고친 JSON에서 자주 나오는 오류입니다. {"a":1,}을 넣으면 1줄 8열에서 「마지막 쉼표는 JSON에서 허용되지 않습니다.」라고 알려 줍니다. 닫는 괄호 바로 앞의 쉼표를 지우면 됩니다. 배열 [1,2,]도 같습니다.

2. 작은따옴표

JSON 문자열은 큰따옴표로 시작하고 끝납니다(RFC 8259 7절). {'a':1}은 1줄 2열에서 「문자열·키는 큰따옴표(“)로 감싸야 합니다.」 오류가 납니다. Python에서 딕셔너리를 print로 찍은 결과를 그대로 붙여 넣을 때 흔합니다. json.dumps로 출력하면 큰따옴표로 나옵니다.

3. 따옴표 없는 키

객체의 이름(키)도 문자열이므로 큰따옴표가 필요합니다. JavaScript 객체 리터럴 {a:1}은 JSON이 아니며, 1줄 2열에서 「키를 큰따옴표로 감싸세요.」 오류가 납니다.

4. 주석

JSON에는 주석 문법이 없습니다. 값 사이에 올 수 있는 것은 공백, 탭, 줄바꿈뿐입니다. 아래 입력은 2줄 3열에서 「JSON에는 주석을 쓸 수 없습니다.」 오류가 납니다.

{
  // port
  "port": 8080
}

주석을 허용하는 JSONC, JSON5는 JSON을 넓힌 별도 형식이어서 표준 JSON 파서로는 읽을 수 없습니다. 설명은 문서에 따로 적거나, 받는 쪽이 무시하는 키에 값으로 넣으세요.

5. 닫지 않은 괄호

여는 괄호와 닫는 괄호는 종류와 순서가 맞아야 합니다. {"a":[1,2}는 [를 닫기 전에 }가 나왔습니다. 이 도구는 오류 위치(1줄 10열)와 함께 「[(1줄 6열)를 닫지 않았습니다.」처럼 여는 괄호의 위치도 알려 줍니다. 긴 JSON이 중간에 잘렸을 때도 같은 오류가 나므로, 로그나 메신저에서 복사하다 끝이 잘리지 않았는지 먼저 확인하세요.

6. NaN·Infinity·undefined

JSON 값은 객체, 배열, 문자열, 숫자, true, false, null 일곱 종류뿐입니다. RFC 8259 6절은 Infinity와 NaN처럼 숫자 문법으로 나타낼 수 없는 값을 허용하지 않습니다. {"a":NaN}은 1줄 6열에서 「JSON 값이 아닙니다(null 또는 숫자로).」 오류가 납니다. true·false·null은 소문자로 써야 하므로 Python의 True도 오류입니다.

JavaScript의 JSON.stringify는 NaN과 Infinity를 null로 바꾸고, 값이 undefined인 속성은 빼 버립니다. 문자열을 직접 이어 붙여 JSON을 만들면 이런 값이 그대로 들어가니, 직렬화 함수를 쓰는 편이 낫습니다.

오류는 아니지만 위험한 중복 키

RFC 8259 4절은 객체 안의 이름이 유일해야 한다고 권고합니다. 유일하지 않을 때의 동작은 예측할 수 없고, 많은 구현이 마지막 값만 남기며, 오류를 내거나 모든 쌍을 돌려주는 구현도 있다고 적혀 있습니다. JavaScript에서 JSON.parse('{"a":1,"a":2}')의 결과는 {"a":2}입니다.

이 도구는 {"a":1,"a":2}를 그대로 정렬해 보여 주면서 두 번째 키 위치(1줄 8열)에 「키 “a”가 중복됩니다. 대부분의 파서는 마지막 값만 남깁니다.」 경고를 붙입니다. 설정 파일을 합치다가 같은 키가 두 번 들어가는 경우가 많으니, 남길 값 하나만 두세요.

오류 위치 읽는 법

  • 줄과 열은 1부터 셉니다. 열은 유니코드 코드 포인트 단위입니다. 한글이나 😀는 한 글자로 세지만, 피부색·가족 이모지처럼 코드 포인트 여러 개로 된 글자는 그 수만큼 열이 늘어납니다.
  • 표시되는 곳은 파서가 더 읽지 못한 자리입니다. 원인은 그 자리나 바로 앞에 있습니다.
  • 오류는 처음 만난 것 하나만 나옵니다. 고친 뒤 다시 확인하세요.
  • 브라우저 JSON.parse의 오류 문구는 엔진마다 다릅니다. 이 도구는 자체 파서로 같은 위치와 문구를 냅니다.

정리

  • JSON은 JavaScript 객체 리터럴보다 좁습니다. 큰따옴표만 쓰고, 끝 쉼표와 주석은 쓸 수 없습니다.
  • 값은 일곱 종류뿐입니다. NaN·undefined는 null이나 숫자로 바꿉니다.
  • 최상위 값은 객체나 배열이 아니어도 됩니다. "text"와 42도 올바른 JSON입니다.
  • 중복 키는 오류가 아니어도 하나만 남깁니다.
  • 고친 뒤에는 JSON 포맷터·검증으로 다시 확인하세요. 입력값은 브라우저 안에서만 처리됩니다.

이 글과 관련된 도구

출처와 기준

다른 가이드