JSON 복구

깨진 JSON을 고칩니다 — 끝에 남은 쉼표, //·/* */ 주석, 작은따옴표, 따옴표 없는 키, 파이썬의 True/False/None까지 — 고친 뒤 보기 좋게 정렬합니다.

직접 코드로 하려면: npm의 json5 패키지에 있는 JSON5.parse가 주석·작은따옴표·따옴표 없는 키·끝 쉼표를 읽습니다. 그 밖의 수리 — 빠진 쉼표, 파이썬 낱말, 따옴표 없는 낱말, 잘린 입력 — 는 이 페이지가 그 위에 더한 처리입니다.

JSON 복구란 무엇인가요?

JSON 복구는 잘못되었거나 표준에 맞지 않는 JSON 텍스트를 올바르고 보기 좋게 정리된 JSON으로 다시 만들어 줍니다. 끝에 남은 쉼표, // 및 /* */ 주석, 작은따옴표 문자열, 따옴표 없는 키, JavaScript 객체 리터럴 같은 흔한 오류를 고칩니다. 거기에 더해 멤버 사이에 빠진 쉼표, 값 자리에 따옴표 없이 쓴 단어, 파이썬의 True·False·None과 자바스크립트의 undefined, 문자열 안에 그대로 들어간 줄바꿈이나 탭도 고칩니다. 결과 아래 “고친 내용”에는 이렇게 고친 것을 하나하나, 붙여넣은 텍스트 기준의 행과 열과 함께 적어 줍니다.

JSON 포매터와 무엇이 다른가요?

포매터는 입력이 이미 올바르다고 가정하고 들여쓰기만 다시 합니다. JSON 복구는 입력이 깨져 있다고 가정하고 먼저 복구한 뒤 정리하므로, 로그·설정 파일·LLM 응답에서 나온 지저분한 JSON도 처리합니다.

JSON이 아닌 것들, 그런데 왜 파일에 들어 있나

JSON은 보기보다 훨씬 작은 언어입니다. 키는 큰따옴표 문자열이어야 하고, 끝에 남은 쉼표도 주석도 작은따옴표도 NaN이나 Infinity도 16진수도 앞의 +도 undefined도 없습니다. 그런데 이 전부가 자바스크립트 객체 리터럴에서는 적법합니다. 소스 파일이나 콘솔, 설정에서 복사한 텍스트가 그토록 자주 파싱에 실패하는 이유입니다. 애초에 JSON이 아니라 JSON을 닮은 자바스크립트였던 것이죠. 파이썬은 여기에 True·False·None을 더합니다.

복구는 추측이고, 어떤 추측은 위험합니다

따옴표를 고치고 끝에 남은 쉼표를 지우는 것은 안전합니다. 의도가 분명하니까요. 닫히지 않은 괄호를 닫는 것은 다릅니다. 전송 중에 잘린 파일은 내용이 빠진 것이고, }를 붙이면 파싱은 되지만 원본 내용 일부가 아무 표시 없이 빠진 결과가 나옵니다. 그래서 중간에 끊긴 입력은 “입력이 열어 둔 것 닫기”를 체크하지 않으면 거부하고, 체크해서 닫았을 때는 잘려 나간 부분이 결과에 없다고 함께 알려 줍니다. 가장 조심해야 할 것은 숫자입니다. JSON에는 숫자 타입이 하나뿐이고 파서는 그것을 double로 읽어서, 2⁵³을 넘는 ID는 어떤 복구가 돌기도 전에 끝자리를 잃습니다. 값이 중요하다면 파싱됐다는 사실을 제대로 읽혔다는 뜻으로 믿지 말고 복구 결과를 원본과 비교하세요.

자주 묻는 질문

어떤 종류의 깨진 JSON을 고칠 수 있나요?

끝에 남은 쉼표, // 및 /* */ 주석, 작은따옴표 문자열, 따옴표 없는 키, JavaScript 객체 리터럴을 고치고, 멤버 사이에 빠진 쉼표, 따옴표 없는 값, True·False·None·undefined, 문자열 안에 그대로 들어간 줄바꿈도 고칩니다. ```json 코드 펜스도 제거하므로 LLM 응답을 그대로 붙여넣을 수 있습니다.

주석이 있는 JSON은 왜 실패하나요?

JSON에는 주석이 없기 때문입니다. // 도 /* */ 도 없습니다. 그건 JSONC나 JSON5로, 여러 도구가 받아들이지만 표준 파서는 받지 않습니다.

잘린 파일을 복구할 수 있나요?

요청할 때만 합니다. 기본으로는 잘린 파일을 읽기가 멈춘 행과 열을 알려 주며 거부합니다. 빠진 괄호를 붙이면 파싱은 되지만 원본 내용 일부가 빠진 결과가 되기 때문입니다. “입력이 열어 둔 것 닫기”를 체크하면 열린 문자열·배열·객체를 닫고(값이 잘려 나간 키에는 null이 들어갑니다), 잘려 나간 부분은 결과에 없다고 경고합니다. 가능하면 원본 전체를 다시 받으세요.

큰 숫자가 왜 바뀌었나요?

JSON은 숫자 타입이 하나뿐이고 파서가 64비트 부동소수점으로 읽는데, 정수를 정확히 담는 한계가 2^53입니다. 더 긴 ID는 끝자리를 잃습니다. 해결은 만들어 보내는 쪽에서 문자열로 보내는 것입니다.

빠진 쉼표를 넣거나 따옴표 없는 값을 감싸 주나요?

해석이 하나뿐일 때는 그렇습니다. 쉼표는 값 하나가 분명히 끝나고 다음 멤버나 요소가 시작되는 자리에만 넣습니다 — {"a": 1 "b": 2}나 [1 2 3] 같은 경우입니다. 값 자리에 따옴표 없이 쓴 단어는 줄 끝까지 이어지는 문자열이 되어, {name: Al Smith}는 "Al Smith"가 통째로 남습니다. 파이썬의 True·False·None과 자바스크립트의 undefined는 문자열 밖에서 true·false·null이 되고, 문자열 안에 그대로 들어간 줄바꿈은 \n으로 적습니다. {"a": 1 2}나 문서 두 개가 이어 붙은 것처럼 해석이 둘인 입력은 추측하지 않고 여전히 거부합니다.

무엇을 고쳤는지 하나하나 볼 수 있고, 같은 일을 내 코드에서도 할 수 있나요?

네. 복구된 JSON 아래 “고친 내용”에 고친 것마다 붙여넣은 텍스트 기준의 행과 열이 붙어 나옵니다 — 지운 주석, 따옴표를 붙인 키, 넣은 쉼표, 바꾼 파이썬 낱말, 닫아 준 문자열·배열·객체 같은 것이고, 같은 키가 거듭 나와 뒤의 값을 남긴 경우도 알려 줍니다. 이미 JSON이었다면 고칠 것이 없었다고 말합니다. 도구 아래 안내 문장은 npm의 json5 패키지에 있는 JSON5.parse가 주석·작은따옴표·따옴표 없는 키·끝에 남은 쉼표를 읽고, 그 밖의 수리는 이 페이지가 그 위에 더한 처리라고 알려 줍니다.