JSON Formatter (JSON 정렬)

브라우저에서 JSON을 정렬·압축·검증합니다. 20.0 같은 숫자와 19자리 ID를 쓰인 그대로 두고, 중복 키를 알려 주며, 오류는 행·열과 원인을 한국어로 보여 줍니다.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요
모든 단계에서 키를 Unicode 코드 포인트 순으로 정렬합니다. jq -S, python3 -m json.tool --sort-keys와 같은 순서입니다. U+007E보다 뒤의 문자를 모두 \uXXXX로 씁니다. python3 -m json.tool의 기본 출력과 같습니다. JSON5(JSONC의 상위 집합, VS Code settings.json 등)로 읽습니다: 주석, 끝 쉼표, 작은따옴표, 따옴표 없는 키, 16진수, .5. 출력은 항상 JSON입니다. NaN과 Infinity는 JSON으로 나타낼 수 없어 계속 오류입니다. JSON.parse는 모든 숫자를 64비트 배정밀도로 저장합니다. 2^53 − 1(9,007,199,254,740,991)을 넘는 정수는 자릿수를 잃고, 1.0은 1, 1e400은 Infinity가 됩니다. 「쓰인 그대로」는 숫자를 그대로 옮기고 JavaScript에서 바뀌는 숫자를 알려 줍니다. 「JavaScript가 읽는 값」은 스크립트가 받는 값을 보여 줍니다. RFC 8259는 이름이 고유해야 한다(SHOULD)고 하며, 중복 키 처리는 파서마다 다릅니다. 「모두 유지」는 모두 남기고 위치를 알려 주며, 「마지막만 유지」는 JSON.parse, jq, Python처럼 마지막 값을 처음 위치에 둡니다.

JSON을 붙여넣거나 파일을 여세요.

JSON을 붙여넣거나, 파일을 도구 위에 끌어다 놓거나, 「파일 열기」를 누르세요(최대 50 MB). 2 MB까지는 입력하는 대로 정렬하고, 그보다 크면 「정렬」을 누르세요. 파싱은 Web Worker에서 하므로 페이지가 멈추지 않습니다. 입력은 이 브라우저의 로컬 저장소에 남고 「지우기」로 지워집니다. 업로드하지 않습니다.
출력 값은 바뀌지 않습니다. 공백은 바뀌고, 문자열 이스케이프는 JSON.stringify 방식으로 씁니다(\u00e9는 é, \/는 /). 1 MB가 넘는 출력은 앞부분 1 MB만 색 구분 없이 보여 주며, 「복사」와 「다운로드」에는 전체가 들어갑니다. 문법만 검사하고 구조는 검사하지 않습니다. 필수 필드와 타입은 JSON Schema 검증기로 확인하세요.
트리에서는 객체와 배열을 접을 수 있고 자식을 200개씩 보여 줍니다. 행을 고르면 JSON Pointer(/items/0/price)나 jq 경로(.items[0].price)를 복사할 수 있습니다. 「모두 펼치기」는 2,000행에서 멈춥니다.
예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.

예시: 서울 열린데이터광장 대기환경 API

서울 열린데이터광장의 실시간 대기환경 API(RealtimeCityAir)는 샘플 인증키로도 JSON을 돌려줍니다. 2026-10-02 11시 측정분에서 중구 한 행만 가져와 정렬해 보았습니다.

{"MSRMT_DT":"202610021100","MSRSTN_NM":"중구","PM":20.0,"FPM":5.0,"OZON":0.034,"CAI_GRD":"보통","CAI_IDX":53.0}

공백 2칸으로 정렬한 결과:

{
  "MSRMT_DT": "202610021100",
  "MSRSTN_NM": "중구",
  "PM": 20.0,
  "FPM": 5.0,
  "OZON": 0.034,
  "CAI_GRD": "보통",
  "CAI_IDX": 53.0
}

미세먼지(PM)와 통합대기환경지수(CAI_IDX)가 응답에 쓰인 대로 20.0, 53.0으로 남습니다. 「숫자」를 「JavaScript가 읽는 값」으로 바꾸면 브라우저 코드가 받는 값으로 씁니다.

{"MSRMT_DT":"202610021100","MSRSTN_NM":"중구","PM":20.0,"FPM":5.0,"OZON":0.034,"CAI_GRD":"보통","CAI_IDX":53.0}

JavaScript가 읽는 값(압축):

{"MSRMT_DT":"202610021100","MSRSTN_NM":"중구","PM":20,"FPM":5,"OZON":0.034,"CAI_GRD":"보통","CAI_IDX":53}

20.0과 20은 같은 값이므로 안내는 나오지 않습니다. 반면 2^53 − 1(9,007,199,254,740,991)을 넘는 정수는 값 자체가 바뀌므로, 「쓰인 그대로」에서도 바뀌는 숫자를 안내에 나열합니다. RFC 8259 6절은 숫자를 IEEE 754 배정밀도로 읽는 소프트웨어와는 −(2^53 − 1)부터 2^53 − 1까지의 정수만 확실히 주고받을 수 있다고 설명합니다. 19자리 주문 번호처럼 큰 ID는 문자열로 보내는 것이 안전합니다.

중복 키

RFC 8259 4절은 객체 안의 이름이 고유해야 한다(SHOULD)고 하며, 중복되었을 때의 동작은 구현마다 다르다고 적고 있습니다. 설정 파일을 합치다 보면 같은 키가 두 번 들어가기 쉽습니다.

{"user_id":42,"plan":"free","plan":"pro"}

「모두 유지」(기본값)에서는 두 항목이 그대로 남고, 안내에 두 번째 plan의 위치가 나옵니다.

{"user_id":42,"plan":"free","plan":"pro"}

JSON.parse, jq, Python은 마지막 값만 남기므로 실제 프로그램이 읽는 값은 “pro”입니다. 「마지막만 유지」를 고르면 그 결과와 같아집니다.

오류 메시지

오류가 나면 상태 줄에 원인을 쓰고, 출력란에 앞 줄·오류가 난 줄·위치 표시를 보여 줍니다. Python 딕셔너리를 그대로 붙여넣은 경우:

{'name': '홍길동', 'active': True}

상태 줄은 「1행 2열: JSON 문자열과 속성 이름은 큰따옴표(“)로 감쌉니다」입니다.

1 | {'name': '홍길동', 'active': True}
  |  ^
입력메시지
{"a":1,}닫는 괄호 앞에 쉼표가 남아 있습니다
{a: 1}속성 이름은 큰따옴표로 감싸야 합니다
{"ok": True}알 수 없는 단어입니다. JSON에는 true, false, null만 있습니다 (True는 Python 표기라는 안내 포함)
[01]숫자 형식이 잘못되었습니다
{"a":1} // 메모JSON에는 주석을 쓸 수 없습니다

JSON에 가까운 입력에는 한 번에 고치는 버튼이 나옵니다. Markdown 코드 블록(```)에 든 JSON(AI 채팅 답변에서 흔함), 문자열로 이스케이프된 JSON(로그의 {\"a\":1}), JSON을 담은 문자열 하나가 해당합니다. 한 줄에 값이 하나씩 있는 JSON Lines에는 JSONL 변환기 링크를 보여 줍니다. VS Code의 settings.json처럼 주석과 끝 쉼표가 있는 JSON with Comments는 「JSON5 / JSONC 허용」으로 변환할 수 있으며, JSON5 규칙으로 읽습니다.

EUC-KR 파일

RFC 8259 8.1절은 주고받는 JSON에 UTF-8을 요구합니다. Windows에서 「ANSI」로 저장한 한글 파일은 EUC-KR(CP949)이어서 「홍길동」이 C8 AB B1 E6 B5 BF 6바이트가 되고, UTF-8로는 잘못된 바이트열입니다. 이 도구로 열면 「파일이 UTF-8이 아닙니다: N번째 바이트부터 잘못된 바이트열입니다」라고 알려 주고, 깨진 글자를 그대로 정렬하지 않습니다. UTF-8로 다시 저장하세요. BOM이 있는 UTF-16 파일은 변환해서 읽고 그 사실을 알려 줍니다. 맨 앞의 BOM(U+FEFF)은 JSON.parse가 오류로 처리하므로 제거합니다.

다른 도구와의 차이

2026-10-02 데스크톱 Chromium에서 {"id":12345678901234567890,"price":19.90,"big":1e400,"z":-0,"a":1,"a":2}와 오류가 있는 입력으로 확인했습니다. 테스트하는 동안 어느 사이트도 JSON을 서버로 보내지 않았습니다.

  • 비볼디(vivoldi.com, Bing에서 「json 정렬」 상위): 결과는 12345678901234567000, 19.9, null, 0이 되고 중복된 a는 2만 남으며 안내가 없습니다. 오류 메시지는 「Property Name Error on line 2, Column 3」처럼 영어로 나오고, 오른쪽 결과 창에는 이전 입력의 결과가 그대로 남아 있어 지금 입력이 잘못되었는지 헷갈립니다.
  • jsonformatter.org: 숫자와 중복 키를 같은 방식으로 바꿉니다.
  • 이 도구: 숫자를 그대로 출력하고 바뀌는 값은 안내에 나열하며, 중복 키는 모두 남기고 위치를 보여 줍니다. 입력이 잘못되면 이전 결과 대신 오류 위치를 표시합니다.

python3 -m json.tool과도 비교했습니다. Python은 기본적으로 한글을 \ud64d\uae38\ub3d9처럼 바꾸지만 이 도구는 그대로 둡니다. 「비 ASCII 이스케이프」를 켜고 공백 4칸으로 하면 Python 3.12와 같은 출력이 나오고, 「키 정렬」은 jq -S, --sort-keys와 같은 유니코드 코드 포인트 순서입니다. 테스트 스크립트는 매번 무작위 문서 400개를 jq 1.7.1과, 120개를 Python 3.12와 비교합니다(버전이 다르면 건너뜀).

FAQ

JSON이 서버로 전송되나요?

전송되지 않습니다. 파싱과 정렬은 브라우저 탭 안에서 처리됩니다. 입력은 이 브라우저의 로컬 저장소에 남아 다음에 열어도 그대로 있고, 「지우기」를 누르면 삭제됩니다.

다른 도구에서 20.0이 20으로 바뀌는 이유는 무엇인가요?

대부분의 온라인 도구는 JSON.parse로 읽은 뒤 JSON.stringify로 다시 씁니다. 이 과정에서 숫자는 64비트 부동소수점 값이 되어 20.0은 20, 1e2는 100으로 쓰이고, 2^53 − 1을 넘는 정수는 값이 바뀝니다. 이 도구는 숫자를 쓰인 그대로 출력합니다.

주석이 있는 JSON(JSONC)도 정렬할 수 있나요?

됩니다. 「JSON5 / JSONC 허용」을 켜거나 오류가 났을 때 「JSON으로 변환」을 누르세요. 주석은 지워지고 끝 쉼표, 작은따옴표, 따옴표 없는 키는 고쳐 쓰며, 바뀐 내용의 종류와 개수를 알려 줍니다. NaN과 Infinity는 JSON으로 나타낼 수 없어 오류로 남습니다.

정렬하면 데이터가 바뀌나요?

값은 바뀌지 않습니다. 바뀌는 것은 공백과 문자열 이스케이프 표기뿐이며, JSON.stringify와 같이 \uc911은 「중」으로, \/는 /로 씁니다. 숫자와 중복 키는 기본적으로 쓰인 그대로 둡니다.

얼마나 큰 파일까지 다룰 수 있나요?

50 MB까지 열 수 있습니다. 2 MB까지는 입력하는 대로 정렬하고, 그보다 크면 「정렬」을 눌러 처리합니다. 파싱과 정렬은 Web Worker에서 실행되므로 처리 중에도 페이지를 조작할 수 있습니다. 입력을 바꾸거나 「정렬」을 다시 누르거나 「지우기」를 누르면 이전 처리는 멈춥니다. 저희 테스트(Apple M1 Max, Chromium 152, 2026-10-03)에서 10.7 MB 파일 정렬에는 2~4초가 걸렸고, 그만한 텍스트를 입력란에 넣는 데에만 브라우저가 1~2초를 썼습니다.