JSON 포맷 도구
JSON 포맷팅이란?
JSON(JavaScript Object Notation)은 경량 데이터 교환 형식으로, 사람이 읽고 쓰기 쉽고 기계가 파싱하고 생성하기 쉽습니다. JSON 포맷팅 도구는 압축된 JSON 데이터를 들여쓰기 정돈되고 읽기 쉬운 형식으로 변환하며, 구문 강조, 오류 감지 및 데이터 검증 기능을 제공합니다. 정렬된 JSON은 구조를 읽기 쉽게 만들지만 데이터 의미를 보장하지는 않습니다. API 응답, 설정 파일, 스키마 검증이 필요한 데이터는 필수 필드와 타입까지 함께 확인해야 합니다.
사용 방법
사용 방법
- 왼쪽 입력란에 JSON 데이터를 붙여넣거나 입력하세요
- 들여쓰기 크기를 선택하세요 (2칸, 4칸 또는 Tab)
- 포맷을 클릭하여 정리하거나, 미니파이를 클릭하여 공백을 제거하세요
- 오른쪽에 구문 강조와 함께 결과가 자동으로 표시됩니다
- 복사 또는 다운로드를 클릭하여 결과를 저장하세요
JSON 검증 참고사항
- 포맷팅은 텍스트가 유효한 JSON임을 증명하지만, 데이터가 비즈니스 스키마와 일치하는지는 증명하지 않습니다.
- 오류가 표시되면, 보고된 행과 열에서 작은따옴표, 후행 쉼표, 주석, 이스케이프되지 않은 제어 문자를 확인하세요.
활용 사례
기술 원리
JSON(JavaScript Object Notation)은 RFC 8259 / ECMA-404에 의해 정의됩니다. 이 문법은 JavaScript 객체 리터럴의 엄격한 부분 집합입니다. 문자열은 쌍따옴표로 감싸야 하고, 키는 따옴표로 감싸야 하며, 후행 쉼표는 허용되지 않고, 주석은 금지됩니다. 포맷터는 `JSON.parse()`로 문서를 호스트 언어 객체 그래프로 파싱한 다음, `JSON.stringify(value, replacer, indent)`로 재직렬화합니다. 여기서 indent는 숫자(1~10 공백) 또는 문자열(`'\t'`)입니다. 파싱은 O(n)이며, 출력 문자열 생성 시 새 문자열을 할당하기 때문에 일반적으로 stringify 단계보다 빠릅니다. 숫자 처리는 IEEE 754 배정밀도를 따릅니다. `Number.MAX_SAFE_INTEGER`(2^53 - 1 = 9007199254740991)보다 큰 정수는 정밀도를 잃으므로, `9007199254740993`은 `9007199254740992`로 라운드트립됩니다. `0.1 + 0.2` 같은 소수 반복은 파싱 후 `0.30000000000000004`로 해석됩니다. 유니코드 문자열은 서러게이트 쌍(`\uD83D\uDE00` → 😀)을 포함한 `\uXXXX` 이스케이프를 허용합니다. 파서는 단일 미페어 서러게이트를 거부합니다. 공백은 문자열 내부에서만 의미가 있으며, 토큰 사이의 space, tab, LF, CR의 모든 조합은 동일하게 파싱됩니다. 일반적인 비표준 완화 형식으로 JSON5(주석, 후행 쉼표, 따옴표 없는 키)와 JSONC(VS Code 설정)가 있습니다. 표준 JSON은 이를 허용하지 않으며, `JSON.parse`는 발견 시 `SyntaxError`를 throw합니다. NDJSON(줄당 하나의 객체)과 JSON Lines 같은 스트리밍 대안은 전체 문서를 메모리에 로드하지 않습니다. 깊이 중첩된 입력의 경우, V8 스택 제한(약 10,000 프레임)이 재귀 기반 파서를 제한하며, 프로덕션 파서는 이터레이티브 상태 머신을 사용하여 한계를 높입니다.
- RFC 8259 / ECMA-404 문법 - 6가지 값 타입(객체, 배열, 문자열, 숫자, true/false, null). 문자열은 쌍따옴표로 감쌈. 키는 반드시 따옴표 필요. 후행 쉼표 없음. 주석 없음.
- `JSON.parse(text)`는 O(n)으로 실행되며, 유효하지 않은 입력에 대해 문자 위치가 포함된 `SyntaxError`를 throw. `JSON.stringify(value, replacer, indent)`는 2~10 공백 또는 `'\t'` 들여쓰기로 포맷된 출력을 생성.
- IEEE 754 숫자 정밀도: `Number.MAX_SAFE_INTEGER = 2^53 - 1`. 이를 초과하는 정수는 가장 가까운 표현 가능한 배정밀도로 반올림되므로, 채팅 ID와 Twitter Snowflake ID는 문자열로 전달해야 함.
- 유니코드 `\uXXXX` 이스케이프는 전체 BMP를 지원. BMP 외 문자는 서러게이트 쌍 인코딩 `\uD83D\uDE00`이 필요. 파서는 RFC 8259 §8.2에 따라 단일 미페어 서러게이트를 거부.
- 일반적인 파싱 실패: 단일 따옴표 문자열(`'foo'`), 마지막 배열/객체 항목 뒤의 후행 쉼표, 문자열 내 이스케이프되지 않은 제어 문자, 이스케이프되지 않은 백슬래시, 닫는 `}`/`]` 누락, 시작 부분의 BOM(`\uFEFF`).
- 순환 참조는 `JSON.stringify`에서 `TypeError: cyclic object value`를 throw. WeakSet을 사용한 `replacer` 콜백으로 순환을 끊거나, `flatted` / `json-stringify-safe` 같은 라이브러리를 사용.
- 비표준 변형: JSON5(`.json5`, 주석과 후행 쉼표 허용), JSONC(VS Code 설정), NDJSON / JSON Lines(줄당 하나의 객체, 스트리밍 친화적) - 모두 strict `JSON.parse`에 의해 거부됨.
예시
객체 예시
입력:
{
"name": "ToolAct",
"type": "web tool",
"active": true
}
출력: 들여쓰기 2칸과 안정적인 키 순서로 정렬되어 출력됩니다배열 예시
입력: [1,2,3,"a","b","c"]
출력: 들여쓰기 2칸으로 정렬됩니다. 숫자는 숫자형으로, 문자열은 따옴표를 유지합니다중첩 구조
입력:
{"user":{"name":"Alex","skills":["JavaScript","Python"]}}
출력:
{
"user": {
"name": "Alex",
"skills": [
"JavaScript",
"Python"
]
}
}
참고: 중첩된 객체와 배열은 재귀적으로 들여쓰기되며, 들여쓰기 너비는 툴바에서 선택할 수 있습니다자주 묻는 질문
포매터는 어떤 일을 하나요?
JSON을 다시 포매팅합니다. 선택한 들여쓰기(2칸 또는 4칸)로 보기 좋게 출력하거나 한 줄로 압축할 수 있습니다. 파싱과 동시에 검증하므로 문법 오류는 줄과 열 위치와 함께 표시됩니다.
왜 제 JSON이 유효하지 않다고 거부되나요?
흔한 원인은 후행 쉼표(JS에선 합법, JSON에선 불법), 작은따옴표 문자열(반드시 큰따옴표), 따옴표 없는 키, 주석(// 또는 /* */), 괄호 누락 등입니다. 이 페이지는 파싱 실패 위치를 알려줍니다. JSON5와 JSONC(주석 있는 JSON)는 JSON의 상위 집합이므로, 이 경우엔 별도의 파서를 사용하세요.
키 순서는 보존되나요?
JSON 명세상 키 순서는 의미가 없지만, 대부분의 파서는 왕복 변환 시 순서를 보존합니다. 이 도구는 삽입 순서를 그대로 유지하므로 가독성 좋은 diff에 적합합니다.
아주 큰 JSON 파일도 처리할 수 있나요?
최신 브라우저는 10~50MB 정도의 JSON은 처리할 수 있지만 편집기가 느려질 수 있습니다. 수백 MB 이상이라면 스트리밍 파서(jq 명령줄, ndjson 도구)를 사용하세요. 브라우저 파서는 트리 전체를 메모리에 올립니다.
JSON이 업로드되나요?
아니요. 파싱과 포매팅은 JSON.parse와 JSON.stringify를 통해 브라우저 안에서 처리됩니다. 붙여 넣은 JSON은 외부로 전송되지 않습니다.
큰 숫자가 정밀도를 잃는 건 왜인가요?
JavaScript의 JSON.parse는 IEEE 754 배정밀도인 Number를 사용합니다. 2^53을 넘는 정수는 정밀도가 떨어집니다(예: 9007199254740993이 조용히 반올림됨). BigInt나 문자열 보존 파싱이 필요하다면 별도 파서를 쓰거나, 생성 측에서 큰 숫자를 미리 문자열로 표시하세요.
JSONC(주석 있는 JSON)는 어떻게 되나요?
엄격한 JSON은 주석을 허용하지 않습니다. 일부 IDE(VS Code 설정 파일 등)는 // 와 /* */ 주석을 추가한 JSONC를 사용합니다. 포매터는 보통 주석을 보존하는 'JSONC' 모드를 제공하며, 엄격 모드에서는 주석이 문법 오류로 처리됩니다.