이게 뭔가요?
한 줄로 뭉쳐 있거나 들여쓰기가 엉망인 JSON을 읽기 좋은 형태로 다시 정렬하고, 동시에 문법이 올바른지 검증하는 도구입니다. 입력하는 즉시 결과가 바뀌고, 오른쪽 위 상태 배지가 유효한 JSON / 오류를 알려 줍니다. 들여쓰기는 2칸·4칸·압축(한 줄) 중에 고를 수 있습니다.
사용법 — 예시로 바로 확인
예시 버튼을 누르면 아래 한 줄 JSON이 입력됩니다.
{"name":"GroundHaus","tools":["json","base64","uuid"],"nested":{"ok":true,"count":12},"empty":null}
2칸 탭을 선택한 결과입니다. 배열 요소도 한 줄에 하나씩 펼쳐집니다.
{
"name": "GroundHaus",
"tools": [
"json",
"base64",
"uuid"
],
"nested": {
"ok": true,
"count": 12
},
"empty": null
}
압축을 선택하면 처음의 한 줄 형태로 돌아갑니다. 로그에 넣거나 요청 본문으로 보낼 때 씁니다.
- 입력 칸에 JSON을 붙여넣습니다. 앞뒤 공백·줄바꿈은 자동으로 무시합니다.
- 상태 배지가 유효한 JSON이면 출력 칸에 정렬된 결과가 보입니다.
- 들여쓰기 탭을 바꾸면 결과가 즉시 다시 그려집니다.
- 복사 버튼으로 결과를 클립보드에 넣습니다. 출력이 길면 전체 화면 버튼으로 넓게 볼 수 있습니다.
최상위가 객체나 배열이 아니어도 됩니다. "abc", 42, true처럼 값 하나만 넣어도 유효한 JSON으로 통과합니다.
오류 위치 읽는 법
아래처럼 마지막 요소 뒤에 쉼표가 남은 JSON을 넣어 보세요.
{
"a": 1,
"b": 2,
}
크롬·엣지에서는 다음과 같이 표시됩니다.
구문 오류 (4번째 줄, 1번째 칸): Expected double-quoted property name
4번째 줄 1번째 칸은 닫는 중괄호 } 자리입니다. 파서는 쉼표 다음에 또 다른 "키"가 올 것으로 기대했는데 }를 만났다는 뜻이라서, 실제 고칠 곳은 그 직전 줄의 쉼표입니다. 오류 위치는 “문제가 발견된 지점”이고, 원인은 보통 바로 앞에 있습니다.
브라우저별 차이는 다음과 같습니다.
| 브라우저 | 표시 방식 |
|---|---|
| 크롬·엣지·웨일 등 (V8 엔진) | 메시지의 position 값을 줄·칸으로 바꿔 (N번째 줄, M번째 칸) 표시 |
| 파이어폭스 | position이 없어 변환 불가. 브라우저 메시지를 그대로 표시하며, 그 안에 line 4 column 1 형태로 위치가 들어 있음 |
| 사파리 | 위치 정보가 없어 메시지만 표시 (예: JSON Parse error: Property name must be a string literal) |
줄 번호는 앞뒤 공백을 제거한 입력 기준입니다. 맨 앞에 빈 줄을 여러 개 두고 붙여넣었다면 그만큼 줄 번호가 작게 나옵니다.
자주 틀리는 문법
| 입력 | 결과 | 이유 |
|---|---|---|
{"a":1,} |
오류 | 마지막 요소 뒤 쉼표(trailing comma)는 JSON 표준에 없음 |
{'a':1} |
오류 | 키와 문자열은 큰따옴표만 허용 |
{"a":1} // 메모 |
오류 | 주석 문법 없음. /* */도 마찬가지 |
{"a":NaN} |
오류 | NaN·Infinity·undefined는 JSON 값이 아님 |
{"a":01} |
오류 | 숫자 앞 0 불가 |
{"a":.5} |
오류 | 소수는 0.5처럼 정수부 필요 |
{"a":"줄\n바꿈"} |
유효 | 문자열 안 줄바꿈은 \n으로 이스케이프 |
[1, 2, 3,] |
오류 | 배열도 마지막 쉼표 불가 |
JavaScript 코드에서 복사한 객체 리터럴은 위 규칙을 자주 어깁니다. tsconfig.json처럼 도구가 주석을 허용해 주는 파일도 표준 JSON은 아니어서 이 도구에서는 오류로 잡힙니다.
알아 두어야 할 변환 동작
이 도구는 입력 문자열을 다시 쓰는 것이 아니라 파싱한 뒤 다시 직렬화합니다. 그래서 문법은 같아도 표기가 달라지는 경우가 있습니다.
| 입력 | 출력 | 설명 |
|---|---|---|
{"id": 12345678901234567890} |
{"id": 12345678901234567000} |
2^53 - 1(9007199254740991)을 넘는 정수는 정밀도 손실 |
{"id": 9007199254740993} |
{"id": 9007199254740992} |
안전 정수 범위 바로 바깥에서도 손실 발생 |
{"a": 1, "a": 2} |
{"a": 2} |
중복 키는 마지막 값만 남고 경고 없음 |
{"10": "x", "2": "y"} |
{"2": "y", "10": "x"} |
정수 모양 키는 숫자 오름차순으로 앞에 정렬됨 |
{"b": 1, "a": 2} |
{"b": 1, "a": 2} |
일반 키는 입력 순서 유지 |
{"n": 1.0} |
{"n": 1} |
1.0, 1e3, -0은 각각 1, 1000, 0으로 |
{"s": "\u00e9"} |
{"s": "é"} |
유니코드 이스케이프는 실제 문자로 풀림 |
{"p": "a\/b"} |
{"p": "a/b"} |
불필요한 이스케이프 제거 |
큰 숫자가 중요한 데이터(주문번호, 스노우플레이크 ID, 금액의 최소 단위 등)는 이 도구로 정렬한 결과를 원본 대신 저장하면 값이 바뀝니다. 검증·읽기 용도로만 쓰고, 보존이 필요하면 원본에서 해당 값을 문자열("12345678901234567890")로 보내도록 바꾸는 것이 근본 해결입니다.