JSON 키 정렬이 실제로 바꾸는 것

JSON 키 정렬은 객체(object)의 속성 순서만 알파벳순(또는 역순)으로 바꿀 뿐, 배열(array) 안 요소의 순서나 데이터 값 자체는 건드리지 않습니다. 서로 다른 시점에 저장된 JSON이나 API 응답 두 개를 나란히 비교하려는 사람, 뒤죽박죽인 설정 파일을 보기 좋게 정리해야 하는 사람에게 필요한 기능입니다. 어떤 옵션이 어디까지 정렬하는지 정확히 알아야 원하는 결과가 나옵니다.
요약 ① 정렬은 객체의 키 순서만 바꾸고, 배열 요소의 순서와 모든 값은 그대로 유지됩니다. ② '재귀적으로 정렬'을 켜야 중첩된 객체와 배열 속 객체의 키까지 정렬되며, 끄면 가장 바깥쪽 키만 정렬됩니다. ③ JSON 문법이 틀리면 정렬 결과 대신 브라우저가 그대로 띄우는 오류 메시지만 표시됩니다.
왜 이런 문제가 생기는가
API 응답이나 설정 파일은 만들어질 때마다 키 순서가 달라지기 쉽습니다. 코드가 객체에 속성을 추가한 순서, 라이브러리가 값을 내보내는 순서에 따라 같은 정보를 담은 JSON이라도 키의 나열 순서는 매번 바뀔 수 있습니다.
이 상태에서 어제 저장한 JSON과 오늘 받은 JSON을 diff나 눈으로 비교하면, 값은 똑같은데 줄 위치만 달라 보여 실제 차이를 찾기 어렵습니다. 키를 같은 규칙(알파벳순)으로 맞춰두면 이런 잡음이 사라지고 진짜 달라진 값만 눈에 띕니다.
다만 정렬이 '내용을 정리'해주는 것은 아닙니다. 정렬은 오직 키가 나열되는 순서만 바꿉니다. 이 경계를 정확히 알아야 결과를 오해하지 않습니다.
도구 없이 손으로 정렬하는 방법
JSON 키 정렬은 브라우저나 별도 도구 없이도 터미널이나 코드 몇 줄로 할 수 있습니다. 대표적인 방법은 두 가지입니다.
- jq 사용: 커맨드라인 JSON 처리 도구 jq에는
-S(정렬) 옵션이 있습니다.jq -S '.' data.json을 실행하면 모든 계층의 객체 키가 알파벳순으로 정렬된 결과가 출력됩니다. - 파이썬 사용:
python3 -c "import json;print(json.dumps(json.load(open('data.json')),sort_keys=True,indent=2))"를 실행하면 마찬가지로 모든 계층의 키가 정렬된 결과를 얻습니다.
두 방법 모두 '최상위만 정렬'과 '전체 재귀 정렬'을 선택할 수 없고, 켜면 항상 모든 계층이 정렬됩니다. 반대로 배열 자체의 순서는 두 방법 다 건드리지 않습니다. jq와 파이썬 모두 배열은 순서가 있는 목록으로 취급해 재정렬 대상으로 삼지 않습니다.
문법 오류를 미리 확인하려면
문법이 올바른지 미리 확인하려면 python3 -m json.tool data.json을 실행하면 됩니다. JSON이 잘못됐다면 몇 번째 줄·열에서 문제가 생겼는지 알려주는 오류가 뜨고, 올바르면 포맷된 결과가 그대로 출력됩니다.
매번 명령어를 치는 대신 브라우저에서 붙여넣기만으로 같은 걸 확인할 수 있습니다. 저희 도구로 확인하기.
브라우저에서 입력한 JSON을 즉시 정렬·포맷하며, 데이터는 서버로 전송되지 않습니다.

정렬 전후, 실제 예시로 비교하기
다음 JSON으로 정렬 전후를 비교해 보겠습니다.
{
"name": "무선 이어폰",
"price": 89000,
"stock": { "seoul": 12, "busan": 5, "daegu": 20 },
"reviews": [
{ "rating": 5, "comment": "좋아요" },
{ "rating": 3, "comment": "보통이에요" }
]
}
재귀 옵션을 끄면 — 바깥쪽 키만 정렬됩니다
'키 알파벳순 정렬'만 켜고 재귀 옵션은 끈 상태로 정렬하면 이렇게 됩니다.
{
"name": "무선 이어폰",
"price": 89000,
"reviews": [
{ "rating": 5, "comment": "좋아요" },
{ "rating": 3, "comment": "보통이에요" }
],
"stock": { "seoul": 12, "busan": 5, "daegu": 20 }
}
가장 바깥쪽 키(name, price, reviews, stock)만 알파벳순으로 재배열됐습니다. reviews 배열 안 두 리뷰의 순서도, 각 리뷰 객체 안 rating·comment의 순서도, stock 안 seoul·busan·daegu의 순서도 그대로입니다.
재귀 옵션을 켜면 — 안쪽 객체도, 배열 속 객체도 정렬됩니다
같은 상태에서 '재귀적으로 정렬'까지 켜면 결과가 달라집니다.
{
"name": "무선 이어폰",
"price": 89000,
"reviews": [
{ "comment": "좋아요", "rating": 5 },
{ "comment": "보통이에요", "rating": 3 }
],
"stock": { "busan": 5, "daegu": 20, "seoul": 12 }
}
stock 객체의 키가 busan, daegu, seoul 순으로 정렬됐고, reviews 배열 안 각 리뷰 객체도 comment, rating 순으로 키가 정렬됐습니다. 그런데 reviews 배열 자체의 두 리뷰 '순서'는 여전히 그대로입니다. 평점 5짜리 리뷰가 여전히 첫 번째입니다. 재귀 옵션은 객체의 키 순서에만 작용하고, 배열이 담은 요소의 순서에는 관여하지 않습니다.
들여쓰기는 보기 좋게만 바꿉니다
들여쓰기 선택(2칸/4칸/탭)은 정렬 결과나 값에는 영향이 없고, 줄바꿈 사이 공백 폭만 바꿉니다. 같은 정렬 결과를 2칸과 4칸으로 각각 뽑으면 이렇게 됩니다.
{
"a": 1,
"b": 2
}
{
"a": 1,
"b": 2
}
탭을 선택하면 공백 대신 탭 문자로 들여쓰집니다. 탭은 코드 편집기의 탭 너비 설정에 따라 화면에 보이는 폭이 달라질 수 있습니다.
문법이 틀리면 뜨는 오류
JSON 문법이 하나라도 틀리면 정렬 결과는 아예 나오지 않고, 파싱에 실패했다는 오류 메시지만 표시됩니다. 예를 들어 닫는 중괄호가 빠진 {"a":1을 넣으면 브라우저는 "Unexpected end of JSON input"처럼 입력이 도중에 끊겼다는 오류를 던집니다.
쉼표가 하나 더 붙은 {"a":1,"b":2,}처럼 마지막 항목 뒤에 쉼표가 남아 있거나, 키를 따옴표 없이 {a:1}로 쓴 경우도 파싱에 실패합니다. 이때는 몇 번째 글자에서 문제가 생겼는지 위치 정보가 포함된 오류가 뜨는데, 정확한 문구와 위치 표기는 브라우저(자바스크립트 엔진)와 버전에 따라 조금씩 다릅니다.
공통점은 하나입니다. 도구가 스스로 오류 문구를 만들어내지 않고, 자바스크립트 엔진이 실제로 던진 오류를 그대로 보여준다는 점입니다. 오류 메시지에 적힌 위치를 보고 그 지점의 쉼표·따옴표·괄호를 확인하면 됩니다.
자주 하는 착각과 실수
정렬 기능을 처음 쓸 때 자주 하는 착각을 정리하면 다음과 같습니다.
| 착각 | 실제 동작 |
|---|---|
| 정렬하면 배열 순서도 바뀐다 | 배열 요소의 순서는 정렬 옵션과 무관하게 항상 그대로입니다 |
| 정렬 체크박스만 켜면 중첩 객체도 다 정렬된다 | '재귀적으로 정렬'을 따로 켜야 안쪽 객체까지 정렬됩니다 |
| 정렬은 값(value)도 재배치한다 | 바뀌는 건 키의 나열 순서뿐이고, 값은 원본 그대로입니다 |
| 문법이 조금 틀려도 알아서 정리해 준다 | 문법이 틀리면 파싱 자체가 실패해 결과가 아예 나오지 않습니다 |
| 역순 정렬은 원래(입력) 순서로 되돌리는 것이다 | 역순은 Z-A 알파벳 역순이지, 입력했던 원래 순서가 아닙니다 |
정리
- 정렬은 객체의 키 순서만 알파벳순(또는 역순)으로 바꾸고, 배열 요소의 순서와 모든 값은 그대로 유지합니다.
- '재귀적으로 정렬'을 꺼두면 가장 바깥쪽 키만, 켜면 중첩된 객체와 배열 속 객체의 키까지 정렬됩니다.
- 들여쓰기(2칸/4칸/탭)는 보기 좋게 만드는 포맷팅일 뿐, 정렬 결과나 값에는 영향을 주지 않습니다.
- JSON 문법이 틀리면 결과 대신 자바스크립트 엔진이 실제로 던진 오류 메시지가 그대로 표시됩니다.
- jq -S나 파이썬 sort_keys=True로도 같은 작업을 손으로 할 수 있지만, 이들은 항상 전체를 재귀적으로 정렬해 '최상위만 정렬'은 고를 수 없습니다.
브라우저에서 입력한 JSON을 즉시 정렬·포맷하며, 데이터는 서버로 전송되지 않습니다.
자주 묻는 질문
정렬하면 원본 데이터의 값도 바뀌나요?
아니요. 바뀌는 것은 객체 안에서 키가 나열되는 순서뿐이고, 문자열·숫자·불리언 같은 값 자체는 전혀 바뀌지 않습니다. JSON 명세(RFC 8259)도 객체 멤버의 순서를 의미 있는 정보로 규정하지 않으므로, 정렬은 사람이 보기 편하도록 순서를 바꾸는 작업일 뿐 데이터의 의미를 바꾸지 않습니다.
숫자로 된 키도 1, 2, 10 순서로 정렬되나요?
아니요. 정렬은 키를 문자열로 비교하므로 "10"과 "2"처럼 숫자처럼 보이는 키도 글자 하나하나를 비교합니다. 첫 글자 '1'이 '2'보다 앞서기 때문에 "10"이 "2"보다 먼저 오는, 사전식(문자열) 정렬 결과가 나옵니다.
배열 안 객체들의 순서를 바꾸고 싶으면 어떻게 하나요?
이 기능으로는 할 수 없습니다. 정렬 옵션은 객체의 '키' 순서만 바꿀 뿐, 배열이 담은 '요소'의 순서에는 재귀 옵션을 켜도 관여하지 않습니다. 요소 자체의 순서를 바꾸려면 별도의 정렬 작업이 필요합니다.
입력한 JSON이 서버로 전송되나요?
아니요. 파싱과 정렬, 포맷 작업은 모두 브라우저 안에서만 이뤄지며 서버로 전송되지 않습니다.
