Сортировщик ключей JSON
Рекурсивная сортировка всех ключей объектов JSON по алфавиту. Порядок массивов сохраняется.
Этот инструмент решил вашу проблему?
Примеры кода
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 objjq (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.jsonGo
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?
Сортировка ключей упрощает сравнение JSON с помощью инструментов diff. Когда два объекта JSON содержат одинаковые данные, но с разным порядком ключей, diff показывает ложные различия. Это также помогает при каноническом сериализации, стандартизации файлов конфигурации и визуальной навигации по большим объектам JSON.
Вложенные объекты тоже сортируются рекурсивно?
Да. Сортировщик рекурсивно обрабатывает все вложенные объекты на любой глубине. Массивы сохраняют свой исходный порядок — сортируются только ключи объектов.
Что происходит с массивами в JSON?
Элементы массивов сохраняют свой исходный порядок, поскольку массивы по определению являются упорядоченными коллекциями. Если массив содержит объекты, ключи внутри каждого объекта сортируются, но порядок самого массива остается неизменным.
Есть ли ограничение на размер JSON-ввода?
Явного ограничения нет, но очень большие JSON-файлы (несколько МБ) могут медленно обрабатываться в браузере. Для больших файлов рекомендуем использовать инструменты командной строки, такие как jq.
Как отсортировать ключи JSON из командной строки?
Используйте jq с фильтром to_entries | sort_by(.key) | from_entries или json.dumps Python с sort_keys=True. Смотрите примеры кода ниже.
Изменяет ли сортировка ключей значение моего JSON?
Нет. Объекты JSON определяются как неупорядоченные коллекции пар ключ-значение, поэтому порядок ключей не имеет семантического значения. Любой JSON-парсер выдаст идентичные результаты независимо от порядка ключей.