깨진 JSON 복구하기: 흔한 오류와 자동 수정 방법
JSON 데이터를 다루다 보면 예기치 않게 파싱 오류를 만나는 경우가 있습니다. 수동 편집 실수부터 로그 잘림까지, 다양한 원인으로 JSON이 깨질 수 있습니다. 이 글에서는 깨진 JSON의 주요 원인과 패턴을 살펴보고, 효율적인 복구 방법을 알아봅니다.
깨진 JSON이 발생하는 원인
수동 편집 실수
설정 파일이나 API 페이로드를 직접 텍스트 에디터로 수정하다가 쉼표를 빠뜨리거나, 괄호를 잘못 닫거나, 따옴표를 누락하는 경우가 가장 흔합니다. 특히 중첩이 깊은 JSON일수록 이런 실수가 눈에 띄지 않기 쉽습니다.
불완전한 복사·붙여넣기
API 응답이나 로그에서 JSON 일부만 복사했을 때 구조가 잘릴 수 있습니다. 브라우저 개발자 도구에서 긴 문자열을 복사하다가 중간이 잘리는 경우도 자주 발생합니다.
로그 잘림 (Log Truncation)
서버 로그 시스템은 라인 길이 제한을 두는 경우가 많습니다. JSON을 한 줄로 로깅했다면, 제한 길이에서 잘려 불완전한 JSON이 남습니다.
문자 인코딩 문제
UTF-8이 아닌 인코딩으로 저장된 파일을 읽거나, BOM(Byte Order Mark)이 포함된 경우 파서가 오류를 낼 수 있습니다.
직렬화 라이브러리 버그
일부 언어의 JSON 직렬화 라이브러리는 특수한 값(무한대, NaN, 순환 참조 등)을 잘못 처리해 비표준 JSON을 생성하기도 합니다.
흔한 오류 패턴
1. 후행 쉼표 (Trailing Comma)
JavaScript 객체 리터럴에서는 허용되지만 JSON 표준에서는 문법 오류입니다.
// 오류 - 마지막 요소 뒤에 쉼표{"name": "Alice","age": 30,}// 정상{"name": "Alice","age": 30}
배열에서도 마찬가지입니다.
// 오류["apple", "banana", "cherry",]// 정상["apple", "banana", "cherry"]
2. 작은따옴표 사용
Python 딕셔너리나 JavaScript 객체를 그대로 붙여넣으면 발생합니다.
// 오류 - 작은따옴표 사용{'name': 'Bob', 'active': true}// 정상 - 큰따옴표만 허용{"name": "Bob", "active": true}
3. 주석 포함
jsonc(JSON with Comments) 포맷을 일반 JSON 파서로 읽으려 할 때 발생합니다.
// 오류 - 주석 포함{// 사용자 정보"name": "Charlie","age": 25 /* 나이 */}
4. 따옴표 없는 키
JavaScript 객체 표기법에서는 키에 따옴표가 없어도 되지만 JSON은 반드시 필요합니다.
// 오류{name: "Dave", age: 28}// 정상{"name": "Dave", "age": 28}
5. 잘린 JSON (Truncated JSON)
// 오류 - 중간에 잘림{"users": [{"id": 1, "name": "Eve"}, {"id": 2, "na
6. 중복 키
표준상 정의되지 않은 동작이지만, 일부 파서는 오류를 내거나 예상치 못한 결과를 반환합니다.
// 주의 - 중복 키{ "status": "active", "status": "inactive" }
오류 유형별 분류
| 오류 유형 | 자동 복구 가능 | 난이도 |
|---|---|---|
| 후행 쉼표 | 가능 | 쉬움 |
| 작은따옴표 | 대부분 가능 | 쉬움 |
| 주석 제거 | 가능 | 쉬움 |
| 따옴표 없는 키 | 대부분 가능 | 보통 |
| 잘린 JSON | 부분 가능 | 어려움 |
| 인코딩 오류 | 불가능 | 어려움 |
| 순환 참조 | 불가능 | 매우 어려움 |
수동 복구 vs 자동 복구
수동 복구가 적합한 경우
- JSON이 짧고 오류 위치가 명확할 때
- 파서 오류 메시지가 정확한 라인·컬럼을 알려줄 때
- 데이터의 의미를 파악하며 수정이 필요할 때
수동 복구 시에는 파서의 오류 메시지를 먼저 읽는 것이 중요합니다. 대부분의 JSON 파서는 line 5, column 12: unexpected token 형태로 위치를 알려줍니다.
try {JSON.parse(input);} catch (e) {console.error(e.message);// "Unexpected token } in JSON at position 47"}
자동 복구가 적합한 경우
- JSON이 크고 오류 위치를 찾기 어려울 때
- 같은 종류의 오류가 반복될 때 (예: 모든 키에 따옴표 없음)
- 빠른 처리가 필요할 때
자동 복구 도구 활용
json-repair 같은 라이브러리는 다양한 비표준 JSON을 자동으로 수정합니다.
import { jsonrepair } from 'jsonrepair';const broken = `{'name': 'Alice', age: 30,}`;const fixed = jsonrepair(broken);// {"name": "Alice", "age": 30}
Python에서는 json_repair 패키지를 활용할 수 있습니다.
from json_repair import repair_jsonbroken = "{'name': 'Alice', 'age': 30,}"fixed = repair_json(broken)# '{"name": "Alice", "age": 30}'
자동 복구가 가능한 경우와 불가능한 경우
복구 가능
- 후행 쉼표 제거
- 작은따옴표 → 큰따옴표 변환
//,/* */주석 제거- 따옴표 없는 키에 따옴표 추가
- 누락된 닫는 괄호·대괄호 추가 (단순한 경우)
- 문자열 내 이스케이프 처리
복구 어렵거나 불가능
- 의미 있는 데이터가 잘린 경우 (어디까지가 원본인지 알 수 없음)
- 바이너리 데이터 오염
- 여러 JSON이 연결된 NDJSON 포맷을 일반 JSON으로 파싱 시도
- 스키마 없이 중복 키 해소
예방 방법
- 에디터 플러그인 사용: VS Code의 JSON 언어 지원은 실시간으로 오류를 표시합니다.
- CI 파이프라인에 검증 추가:
ajv,jsonschema등으로 배포 전 검증을 자동화합니다. - 로깅 시 구조화된 포맷 사용: JSON을 로그에 직접 쓰기보다 로깅 라이브러리의 구조화 로깅을 활용하세요.
- 직렬화 라이브러리 선택:
JSON.stringify보다 검증 기능을 포함한 라이브러리를 고려하세요.
JSONKit Repair 도구 활용
JSONKit의 Repair 도구는 브라우저에서 바로 깨진 JSON을 분석하고 복구합니다. 후행 쉼표, 작은따옴표, 주석, 따옴표 없는 키 등 흔한 오류를 자동으로 감지해 수정안을 제시합니다. 수정 전·후를 나란히 비교할 수 있어, 의도치 않은 변경이 없는지 확인하기 편리합니다. 모든 처리는 클라이언트 측에서 이루어지므로 민감한 데이터를 외부 서버에 전송할 필요가 없습니다.
마무리
깨진 JSON을 만났을 때 당황하지 말고, 먼저 오류 메시지를 읽고 패턴을 파악하세요. 단순한 오류라면 자동 복구 도구로 빠르게 해결할 수 있고, 복잡한 경우에는 수동으로 구조를 검토해야 합니다. 평소에 JSON 검증을 습관화하면 런타임 오류를 크게 줄일 수 있습니다.