JSON 키 정렬기

모든 JSON 객체 키를 재귀적으로 알파벳순으로 정렬합니다. 배열 순서는 유지됩니다.

정렬:
들여쓰기:
예시:
입력 JSON0
정렬된 출력

이 도구가 도움이 되었나요?

코드 예제

JavaScript

// Recursive JSON key sort
function sortKeys(value, order = 'asc') {
  if (Array.isArray(value))
    return value.map(v => sortKeys(v, order));
  if (value !== null && typeof value === 'object') {
    const keys = Object.keys(value).sort(
      order === 'asc'
        ? (a, b) => a.localeCompare(b)
        : (a, b) => b.localeCompare(a)
    );
    return Object.fromEntries(
      keys.map(k => [k, sortKeys(value[k], order)])
    );
  }
  return value;
}

const sorted = JSON.stringify(
  sortKeys({ z: 3, a: 1, m: 2 }),
  null, 2
);
// { "a": 1, "m": 2, "z": 3 }

Python

import json

data = {"z": 3, "a": 1, "m": 2, "nested": {"y": 9, "b": 2}}

# Built-in sort_keys option
sorted_json = json.dumps(data, sort_keys=True, indent=2)
print(sorted_json)
# {
#   "a": 1,
#   "m": 2,
#   "nested": { "b": 2, "y": 9 },
#   "z": 3
# }

# Reverse / descending sort
def sort_keys_desc(obj):
    if isinstance(obj, dict):
        return {k: sort_keys_desc(obj[k])
                for k in sorted(obj, reverse=True)}
    if isinstance(obj, list):
        return [sort_keys_desc(v) for v in obj]
    return obj

jq (CLI)

# Sort all keys recursively (ascending)
jq 'walk(if type == "object"
  then to_entries | sort_by(.key) | from_entries
  else . end)' input.json

# One-liner for simple objects
echo '{"z":3,"a":1}' | jq -S .
# -S flag sorts keys alphabetically

# Sort and save to file
jq -S . input.json > sorted.json

Go

package main

import (
    "encoding/json"
    "sort"
)

// JSON marshaling in Go preserves map key
// order alphabetically by default.

func SortKeys(v interface{}) interface{} {
    switch val := v.(type) {
    case map[string]interface{}:
        keys := make([]string, 0, len(val))
        for k := range val { keys = append(keys, k) }
        sort.Strings(keys)
        result := make(map[string]interface{})
        for _, k := range keys {
            result[k] = SortKeys(val[k])
        }
        return result
    case []interface{}:
        for i, item := range val {
            val[i] = SortKeys(item)
        }
    }
    return v
}

// json.Marshal on map[string]interface{}
// already sorts keys alphabetically.
b, _ := json.MarshalIndent(data, "", "  ")

자주 묻는 질문

왜 JSON 키를 정렬해야 하나요?

키를 정렬하면 diff 도구로 JSON을 더 쉽게 비교할 수 있습니다. 두 JSON 객체가 동일한 데이터를 갖지만 키 순서가 다른 경우 diff가 잘못된 변경 사항을 표시합니다. 또한 정규화된 직렬화, 설정 파일 표준화, 대형 JSON 객체의 시각적 탐색에도 도움이 됩니다.

중첩된 객체도 재귀적으로 정렬되나요?

네. 정렬기는 모든 깊이의 중첩된 객체를 재귀적으로 처리합니다. 배열은 원래 순서를 유지하며, 객체 키만 정렬됩니다.

JSON의 배열은 어떻게 처리되나요?

배열 요소는 원래 순서를 유지합니다. 배열은 정의상 순서가 있기 때문입니다. 배열에 객체가 포함된 경우 각 객체 내의 키는 정렬되지만, 배열 순서 자체는 변경되지 않습니다.

JSON 입력에 크기 제한이 있나요?

명시적인 제한은 없지만, 매우 큰 JSON 파일(수 MB)은 브라우저에서 처리 속도가 느릴 수 있습니다. 큰 파일의 경우 jq와 같은 커맨드라인 도구 사용을 권장합니다.

커맨드라인에서 JSON 키를 정렬하려면 어떻게 하나요?

jq의 to_entries | sort_by(.key) | from_entries 필터나 Python의 json.dumps(data, sort_keys=True)를 사용할 수 있습니다. 아래 코드 예제를 참조하세요.

키를 정렬하면 JSON의 의미가 변경되나요?

아니요. JSON 객체는 키-값 쌍의 순서 없는 컬렉션으로 정의되므로, 키 순서는 의미적으로 중요하지 않습니다. 어떤 JSON 파서든 키 순서에 관계없이 동일한 결과를 생성합니다.