JSON의 따옴표 없는 키 고치기

name, active, profile처럼 일반 식별자처럼 보이더라도, 유효한 JSON에서는 항상 따옴표로 감싸야 합니다.

왜 따옴표 없는 키는 실패하는가

JavaScript는 객체 리터럴 안에서 따옴표 없는 속성 이름을 허용합니다. JSON은 허용하지 않습니다; 모든 객체 키는 큰따옴표로 감싼 문자열이어야 합니다.

잘못된 예

{ name: "Ada", active: true }

수정된 JSON

{ "name": "Ada", "active": true }

JavaScript 식별자가 JSON 키처럼 보이는 이유

JavaScript 객체 리터럴에서 name은 유효한 식별자이므로 { name: "Ada" }가 합법입니다. JSON은 그 지름길을 없애 파서가 모든 키에 대해 단 하나의 형태 — 따옴표 친 문자열 — 만 인식하면 되도록 했습니다. 그래야 문법이 어느 언어에서도 구현할 수 있을 만큼 작게 유지됩니다.

항상 따옴표가 필요한 키

파서가 따옴표 없는 식별자를 받아들이더라도 여러 형태의 키는 여전히 따옴표가 필요합니다: return, class 같은 예약어, 하이픈이나 점을 포함하는 이름, 숫자로 시작하는 이름, 결합 문자나 이모지가 포함된 유니코드 이름 등입니다. 모든 키에 따옴표를 두는 것이 이 모든 경계 사례를 한 번에 피하는 방법입니다.

자동 수리가 안전하게 빈 키에 따옴표를 다는 조건

수리 도구는 키 위치 — 즉 { 또는 , 바로 뒤이고 :가 뒤따르는 위치 — 에 있는 따옴표 없는 식별자에만 따옴표를 답니다. 이미 따옴표가 있는 키, 값, 문자열 내부의 텍스트는 건드리지 않으므로, 유효한 키와 무효한 키가 섞여 있어도 따옴표를 추가하는 것은 안전합니다.

JSON5와 JSONC

JSON5와 JSONC(VS Code의 설정에서 쓰는 포맷)는 둘 다 따옴표 없는 키와 주석을 허용합니다. 사람이 편집하는 설정에는 좋지만 데이터 교환용으로는 안 됩니다 — JSON5를 API로 노출하면 표준 클라이언트가 거부합니다.

FAQ

Q: 왜 내 JSON에 따옴표 없는 키가 있죠? A: 대개 JavaScript 객체 리터럴에서 복사했거나, 따옴표를 잊은 템플릿 엔진이 만든 것입니다. Q: package.json에서는 키에 따옴표 없이 둬도 되나요? A: 안 됩니다 — package.json은 엄격한 JSON이고, tsconfig.json(JSONC)만 그것을 허용합니다.