JSON Toolkit

후행 쉼표가 JSON을 깨는 이유

핵심 요약: 후행 쉼표는 JavaScript 객체 리터럴에서는 합법이고 JSON에서는 치명적입니다. 정확한 오류, 원인이 되는 RFC 8259 문법, 실제로 유효한 세 가지 수정을 설명합니다.

초급약 3분 소요2026-10-30 발행2026-10-30 업데이트
JSON에서 후행 쉼표가 실패하는 이유와 수정법

핵심부터 말하면, JSON은 모든 곳에서 후행 쉼표를 금지합니다. 파서가 실패하면 포매터로 마지막 쉼표를 삭제하세요. JSON5나 JSONC는 로컬의 관대한 파싱에만 쓰고 다른 시스템에는 항상 표준 JSON을 내보내세요.

문법이 그렇게 말하기 때문입니다.

{
  "name": "demo",
  "size": 12,
}

JSON.parse는 Unexpected token } in JSON at position 34를 던집니다. Node는 문구가 다르지만 모든 엔진이 같은 곳을 가리킵니다. } 앞의 쉼표입니다.

파서가 실제로 불평하는 것

RFC 8259의 객체 생성 규칙은:

object = begin-object [ member *( value-separator member ) ] end-object

대괄호는 선택, 별표는 0개 이상을 뜻합니다. 평범하게 말하면 쉼표가 멤버를 구분하고, 마지막 멤버 뒤에는 바로 }가 옵니다.

그래서 쉼표 뒤에서 파서는 다음 멤버 이름을 준비합니다. }를 읽고 실패합니다. 배열도 같습니다. [1, 2, 3,]는 ]에서 실패합니다.

습관은 어디서 오나

JavaScript 객체 리터럴은 ES5부터 후행 쉼표를 허용하고, Python 리스트와 Go 복합 리터럴도 그렇습니다. 에디터가 자동으로 더합니다. 누군가 .js 파일의 객체 리터럴을 .json 파일로 복사하고 파일이 파싱되지 않습니다.

또 다른 흔한 원천은 손으로 만든 JSON입니다. i <= length로 도는 루프가 마지막 요소 뒤에 쉼표를 남깁니다.

세 가지 수정

쉼표 제거. 수동 편집에는 괜찮습니다. JSON 포매터에 붙여 넣으면 오류가 행과 열로 보고되어 정확히 어느 것을 지울지 보입니다.

JSON5로 파싱. 상위 집합은 후행 쉼표를 받아들이고 로컬 설정에는 괜찮습니다. 다른 시스템에 보내는 것에는 괜찮지 않습니다. 수신자는 여전히 거부합니다.

문자열 연결 중단. JSON.stringify, json.dumps, Jackson을 쓰세요. 직렬화기가 구분자를 올바로 처리하고 동시에 이스케이프도 해결합니다.

빠른 점검 목록

위치 흔한 원인
루프 연결 i <= length가 쉼표를 하나 더 남김
복사 붙여넣기 JS 파일에서 가져온 객체 리터럴
템플릿 하드코딩 쉼표에 루프가 또 더함
수동 편집 마지막 필드를 지웠지만 쉼표를 남김

FAQ

후행 쉼표가 JavaScript에서는 합법인데 JSON에서는 아닌 이유는?

JavaScript 객체 리터럴은 ES5부터 허용하고 Python 리스트와 Go 복합 리터럴도 그렇습니다. 그래서 습관이 JSON까지 따라옵니다. RFC 8259는 쉼표를 멤버 사이에만 허용하고 마지막 멤버 뒤에는 바로 }나 ]가 옵니다. .js 파일 객체 리터럴을 .json 파일로 복사하는 것이 흔한 원인입니다.

후행 쉼표를 받아들이려고 JSON5로 파싱해야 하나?

로컬 설정에만입니다. 상위 집합은 후행 쉼표를 받아들이지만 다른 시스템에 보내는 것은 엄격한 JSON으로 파싱되어 여전히 실패합니다. 수신자가 관대하기를 기대하지 말고 출력 경계에서 표준 JSON을 생성하세요.

후행 쉼표 오류 후 어디를 먼저 봐야 하나?

오류 메시지의 위치에서 시작하세요. 대개 }나 ] 앞의 쉼표를 가리킵니다. 그다음 세 흔한 원천을 확인하세요. i <= length로 쓴 루프, JS 파일에서 붙여 넣은 객체 리터럴, 쉼표를 하드코딩한 템플릿. 포매터에 붙여 넣으면 정확한 행과 열을 보고합니다.

더 읽을거리