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 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 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 顺序如何都会产生相同的结果。