JSON 파일을 읽히려는데 빨간 글씨로 이런 메시지가 뜬 적이 있을 것입니다.
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Expecting ',' delimiter: line 1 column 15 (char 14)
Illegal trailing comma before end of object: line 1 column 26 (char 25)
웹에서는 흔히 "Unexpected token"으로, 파이썬에서는 위처럼 표시됩니다. 표현은 달라도 원인은 거의 정해져 있습니다. JSON은 문법이 까다로워서, 사람이 손으로 고치다 보면 쉼표 하나, 따옴표 하나에서 어긋나기 때문입니다.
이 글은 자주 나오는 잘못된 JSON을 실제로 파싱해 보고, 어떤 메시지가 뜨는지와 어디를 고치면 되는지를 증상별로 묶었습니다.
먼저, 에러 메시지 읽는 법
파이썬 표준 라이브러리 json은 잘못된 부분을 꽤 정확히 짚어 줍니다. 메시지 끝의 line은 몇 번째 줄, column은 그 줄에서 몇 번째 글자, char는 파일 처음부터 센 글자 위치입니다.
"column 26"이 보이면 그 줄 26번째 글자 근처를 보면 됩니다. 아래 결과는 모두 윈도우 11, 파이썬 3.14.3 표준 라이브러리 json 모듈로 직접 파싱해 받은 실제 출력입니다.
증상 1. 끝에 쉼표가 남았을 때 (후행 쉼표)
가장 흔한 실수입니다. 항목을 지우거나 마지막 줄 뒤에 습관적으로 쉼표를 붙이면 생깁니다. 다음을 파싱하면,
{"name": "kim", "age": 30,}
파이썬 3.14에서 나온 실제 메시지는 이렇습니다.
Illegal trailing comma before end of object: line 1 column 26 (char 25)
column 26은 닫는 중괄호 } 바로 앞, 즉 마지막 30,의 쉼표 자리입니다. JSON은 자바스크립트와 달리 마지막 항목 뒤 쉼표를 허용하지 않습니다. 닫는 괄호 바로 앞의 쉼표를 지우면 끝입니다.
{"name": "kim", "age": 30}
참고로 구버전 파이썬이나 다른 도구에서는 같은 상황이 "Expecting property name enclosed in double quotes"로 뜨기도 합니다. 메시지 문구는 도구마다 달라도 범인은 같은 쉼표입니다.
증상 2. 작은따옴표를 썼을 때
파이썬 사전이나 자바스크립트 객체를 그대로 붙여 넣으면 작은따옴표가 섞입니다. 다음 입력은,
{'name': 'kim'}
이런 메시지를 냅니다.
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
column 2는 여는 중괄호 다음, 첫 키가 시작되는 자리입니다. JSON에서 문자열은 큰따옴표만 허용합니다. 작은따옴표를 모두 큰따옴표로 바꾸면 됩니다.
{"name": "kim"}
증상 3. 키에 따옴표가 없을 때
자바스크립트 객체 표기에 익숙하면 키를 따옴표 없이 적기 쉽습니다. 다음은,
{name: "kim"}
증상 2와 똑같은 메시지를 냅니다.
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
JSON은 값뿐 아니라 키 이름도 반드시 큰따옴표로 감싸야 합니다. 파서가 키 자리에서 따옴표를 못 찾으면 작은따옴표든 따옴표 없음이든 같은 안내를 냅니다. 키를 큰따옴표로 묶으면 해결됩니다.
{"name": "kim"}
증상 4. 닫는 괄호가 빠졌을 때
중첩이 깊어지면 닫는 중괄호나 대괄호를 빠뜨리기 쉽습니다. 다음처럼 끝의 }가 없으면,
{"name": "kim"
제목에서 본 그 메시지가 나옵니다.
Expecting ',' delimiter: line 1 column 15 (char 14)
파서는 값 다음에 쉼표(다음 항목)나 닫는 괄호가 와야 한다고 기대하는데 둘 다 없으니, "여기서 쉼표를 기대했다"고 알려 줍니다. column 15는 문자열이 끝난 직후 위치입니다. 빠진 닫는 괄호를 채우면 됩니다.
{"name": "kim"}
이 메시지가 파일 끝부분(마지막 줄)을 가리키면 닫는 괄호 누락을, 중간을 가리키면 항목 사이 쉼표 누락을 의심하면 됩니다.
증상 5. 주석을 넣었을 때
설정 파일에 익숙한 분들이 자주 막히는 부분입니다. JSON은 주석을 지원하지 않습니다. 다음처럼 // 주석을 넣으면,
{
// user
"name": "kim"
}
주석 줄에서 막힙니다.
Expecting property name enclosed in double quotes: line 2 column 3 (char 4)
line 2, column 3이 바로 //가 시작되는 자리입니다. 파서는 그 자리에 키가 와야 하는데 슬래시를 만나 멈춥니다. 해결은 주석을 모두 지우는 것입니다. 주석이 꼭 필요하면 JSON 대신 JSONC나 YAML 같은 형식을 쓰거나, 주석 내용을 별도 키로 옮기면 됩니다.
덤. "Expecting value"와 "Extra data"
위 다섯 가지만큼 자주 보이는 두 메시지도 같이 정리합니다.
| 입력 예 | 실제 메시지 | 뜻 |
|---|---|---|
| {"x": } | Expecting value: line 1 column 7 | 값이 비었음, 값을 채워야 함 |
| [1, 2,, 3] | Expecting value: line 1 column 7 | 쉼표가 겹침, 빈 자리에 값이 없음 |
| {"a":1} {"b":2} | Extra data: line 1 column 9 | 객체가 둘, 하나만 와야 함 |
"Expecting value"는 값이 와야 할 자리가 비었다는 뜻이고, "Extra data"는 JSON 하나가 끝난 뒤 또 다른 내용이 붙어 있다는 신호입니다. 여러 객체를 한 파일에 담으려면 대괄호로 묶어 배열로 만들어야 합니다.
직접 확인하고 싶다면
아래 코드를 그대로 실행하면 위 다섯 가지 잘못된 JSON을 차례로 파싱하면서 메시지와 위치를 출력합니다. 별도 설치 없이 파이썬 표준 라이브러리만 씁니다.
import json
cases = {
"trailing comma": '{"name": "kim", "age": 30,}',
"single quotes": "{'name': 'kim'}",
"unquoted key": '{name: "kim"}',
"missing brace": '{"name": "kim"',
"has comment": '{\n // user\n "name": "kim"\n}',
}
for label, text in cases.items():
try:
json.loads(text)
print(label, "-> OK")
except json.JSONDecodeError as e:
print(f"{label}: {e.msg} (line {e.lineno}, col {e.colno})")
코드에서 e.lineno, e.colno를 꺼내면 깨진 위치를 프로그램에서 직접 다룰 수 있습니다. 위치값은 도구마다 1글자 정도 차이가 날 수 있으니 정확한 한 칸보다 그 주변을 보면 됩니다.
한 번에 잡는 순서
증상을 외우기보다 점검 순서를 두면 빠릅니다. 메시지가 가리키는 줄과 열로 가서 위에서부터 차례로 확인하세요.
따옴표는 전부 큰따옴표인가, 닫는 괄호 앞에 쉼표가 남지 않았나, 괄호 개수가 짝이 맞나, 주석을 넣지 않았나. 이 네 가지만 보면 대부분의 파싱 오류가 잡힙니다.
자주 묻는 질문
Q. 웹 브라우저에서는 "Unexpected token"이라고만 뜨는데 위치를 모르겠어요.
브라우저는 친절하지 않은 편입니다. 같은 파일을 파이썬 json이나 온라인 검사 도구에 넣으면 위처럼 줄과 열을 알려 주니 위치 찾기가 훨씬 쉽습니다.
Q. 분명히 따옴표를 다 큰따옴표로 했는데도 깨져요.
워드나 메모 앱에서 복사하면 곧은 따옴표("")가 둥근 따옴표(“”)로 바뀌어 있을 수 있습니다. 눈으로는 비슷해도 파서는 다른 글자로 봅니다. 편집기에서 곧은 따옴표로 다시 입력해 보세요.
Q. None, True 같은 값을 넣었더니 오류가 나요.
JSON의 표기는 소문자 null, true, false입니다. 파이썬식 None이나 첫 글자가 대문자인 True는 값으로 인식되지 않아 "Expecting value"가 납니다.
JSON 오류 메시지는 겁주려는 것이 아니라 위치를 알려 주는 안내입니다. line과 column을 따라가 따옴표, 쉼표, 괄호, 주석 순으로 살피면 대부분 손쉽게 풀립니다.
'파일 형식 백과사전' 카테고리의 다른 글
| 확장자가 .jsonl인데 JSON이 깨진 게 아닙니다, JSON Lines(NDJSON) 정체와 일반 JSON과의 차이 (0) | 2026.07.07 |
|---|---|
| 받은 JSON을 엑셀로 봐야 할 때, XLSX로 변환하는 가장 깔끔한 방법 (0) | 2026.07.06 |
| CSV를 Parquet로 변환하기, 특별한 프로그램 없이 pandas 한 줄이면 됩니다 (1) | 2026.07.04 |
| 같은 데이터를 CSV와 Parquet로 저장하면 용량과 읽기 속도가 얼마나 차이 날까 (0) | 2026.07.03 |
| CSV를 UTF-8로 저장하는 법, 엑셀과 메모장과 파이썬에서 각각 (0) | 2026.07.02 |