JSON Key 排序
递归排列所有 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 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 key 排序?
排序 key 能让 JSON 的 diff 对比更清晰——当两个 JSON 对象数据相同但 key 顺序不同时,diff 工具会误报差异。此外,排序后的 JSON 更便于规范化存储、配置文件标准化以及视觉浏览大型对象。
嵌套对象也会递归排序吗?
会。排序工具会递归处理所有层级的嵌套对象。数组保持原有顺序不变,只对对象的 key 进行排序。
JSON 中的数组会怎么处理?
数组元素保持原顺序不变,因为数组本身是有序集合。如果数组元素是对象,则对象内的 key 会被排序,但数组顺序本身不受影响。
JSON 输入有大小限制吗?
没有明确限制,但很大的 JSON 文件(多 MB)在浏览器中处理可能较慢。对于大文件,建议使用命令行工具,如 jq:jq 'to_entries | sort_by(.key) | from_entries' file.json
如何在命令行排序 JSON key?
可使用 jq 的 to_entries | sort_by(.key) | from_entries 过滤器,或 Python 的 json.dumps(data, sort_keys=True)。详见下方代码示例。
排序 key 会改变 JSON 的语义吗?
不会。JSON 对象被定义为无序的键值对集合,key 的顺序在语义上没有意义。任何符合规范的 JSON 解析器处理同一数据时,无论 key 顺序如何都会产生相同的结果。