JSON 排序

免费在线 JSON 排序工具,一键把 JSON 对象的键名按字母序排列,或对数组元素按值排序,可切换升序/降序、是否递归嵌套。

相关推荐

什么是 JSON 排序(JSON Sort)?

JSON 排序(JSON Sort)是把 JSON 对象内的键名按某种顺序(最常见是字母序)重新排列,或把 JSON 数组的元素按某种规则(数字大小、字符串字典序)重排。它不会改变任何字段值或字段类型,只是把"物理顺序"统一,让不同来源、不同时间、不同开发者产生的 JSON 在结构上完全对齐——这是一种典型的规范化(canonicalization)操作。

工程实践中需要 JSON 排序的 5 大原因:① **减少 Git Diff 噪音**——不同开发者用不同顺序构造的 JSON 对象提交时会生成大量无意义 diff,统一键名顺序后 diff 聚焦在真正变更的字段;② **配置规范化**——CI/CD 流水线、配置中心、Feature Flag 服务希望所有环境配置键名顺序一致,便于审计、回滚、跨环境 diff;③ **数据对比**——用 JSON Diff 工具比较两个 JSON 前先排序,能消除"键名顺序不同"造成的假差异;④ **API 响应标准化**——前端对响应做缓存或算 hash 时希望键名顺序稳定,避免相同业务数据因键序不同被识别为不同 key;⑤ **可读性**——手工构造的 JSON 经常是按业务逻辑添加字段的,排序后视觉上更整齐。

实现层面,JSON 排序的核心是对每一层对象的键按 `localeCompare` 排序,递归处理嵌套对象。GeekFormat 的 JSON 排序工具内置两种模式:① **按键名排序**(默认):只对对象键名按字母顺序重排,保持数组元素顺序;② **按数组元素排序**:把数组内的元素按序列化后的字符串字典序排序。同时支持递归开关、升序/降序切换。整个过程在浏览器本地完成,不上传任何内容。

适用场景

  • 前端开发把 Storybook 的 Mock JSON 排序后再写入组件 stories,避免不同故事间键顺序杂乱、story diff 噪音大。
  • 后端在写 Controller 单元测试前,把 OpenAPI 生成的样例响应先排序再写进断言快照,保证 CI 上每次断言字符串完全一致。
  • 数据分析师把数据库导出的订单 JSON 数组按 price 数值字段升序排序后导出 CSV,列顺序稳定便于在 Excel 里做区域筛选和对比。
  • 测试工程师排查线上 bug 时,把出问题的 API 响应和正常响应分别排序后丢进 JSON Diff 工具,消除键名顺序造成的假差异,只看真变更。
  • 运维翻查应用日志里 JSON 行时,先把整段粘到本工具按键名排序再 grep 关键字段(如 level、trace_id),定位更快。
  • 后端在 PR 描述里贴接口返回示例时,先用本工具排序键名,避免评审人看到一坨顺序各异的字段,沟通成本更低。
  • 产品经理拿到多份用户访谈记录导出的 JSON 后,先把每份的字段按固定顺序排好再合并阅读,确保跨受访者横向比较时不漏字段。
  • 数据工程师把 Kafka 消费到的埋点 JSON 数组成员按 created_at 数值字段降序排后归档,落盘顺序稳定便于回放。
  • 前端在把环境变量 .env.json 注入构建流水线前先递归排序键名,保证 dev/staging/prod 三套配置在内容相同时哈希一致,避免缓存击穿。
  • 配置管理员把 Apollo/Nacos 配置中心导出的 JSON 文件排序后再做 Schema 校验,先让结构整齐再校验字段约束,校验报告更易读。
  • 客服把聊天记录导出 JSON 数组按 send_at 数值字段升序排好,再转 YAML 喂给 LLM 做情绪分析,避免时间错乱的对话误导模型。
  • 前端开发从 ChatGPT 复制的 JSON 排版混乱时,先粘进本工具排序键名再格式化为 2 空格缩进,得到整洁可提交的入参示例。
  • 运维处理 Redis Cluster 导出的 .rdb 快照转 JSON 排版错乱时,先排序键名再 diff 两次备份,能快速识别到底改了哪些字段。
  • 数据分析师把 MongoDB aggregate 结果导出为 JSON 数组后,用本工具按数组模式加数值类型升序排好,再丢给下游 SQL 转换工具批量入库,列顺序稳定可追溯。
  • 后端在 GraphQL 多端点返回结构对齐前,把每个端点响应 JSON 分别排序后存为 fixture,前后端共用同一份规范化样本。

使用方法

  1. 把需要排序的 JSON 内容粘贴到左侧输入框,或点击「示例」加载一个典型多层级 JSON,或上传 .json/.txt 文件
  2. 在底部选项栏中选择排序模式:默认「按键名排序」;如需对数组内元素排序,切换到「按数组排序」
  3. 根据需要切换升序 / 降序按钮,勾选或取消「递归」选项(默认开启)
  4. 点击「排序」按钮,右侧输出框会显示排序后的格式化结果;点击「复制」或「下载」保存为 sorted.json

功能特点

  • 两种排序模式:支持"按对象键名排序"和"按数组元素排序"两种核心模式,可一键切换
  • 递归嵌套处理:默认开启递归,深入多层嵌套对象对每一层级都做键名排序,确保结构整齐一致
  • 升序/降序切换:内置升序(A-Z)/ 降序(Z-A)切换按钮,灵活适配阅读习惯和业务要求
  • localeCompare 字典序:键名比较使用本地字典序,对中文、特殊字符、emoji 都能正确排序
  • 保留数据结构:只调整键名顺序与数组元素顺序,不增删任何字段、不修改值类型
  • 示例数据快速体验:内置"动物园 + alpha/beta/omega"演示数据,一键加载即可看到排序效果
  • 本地处理保护隐私:解析、排序、格式化全部在浏览器本地完成,输入内容不发送到任何服务器
  • 无缝衔接下游:排序结果可一键复制到 JSON 格式化、Diff 对比、Schema 校验等工具中继续处理

代码示例

使用 JavaScript Object.keys + sort 排序对象键名

javascript
// 按键名递归排序, 返回新对象(不修改原对象)
function sortKeysDeep(value) {
  if (Array.isArray(value)) return value.map(sortKeysDeep);
  if (value !== null && typeof value === 'object') {
    return Object.keys(value)
      .sort((a, b) => a.localeCompare(b))
      .reduce((acc, k) => {
        acc[k] = sortKeysDeep(value[k]);
        return acc;
      }, {});
  }
  return value;
}

const data = { zoo: { animals: ['zebra', 'elephant'] }, alpha: 1, beta: 2 };
const sorted = sortKeysDeep(data);
console.log(JSON.stringify(sorted, null, 2));
// => {
//      "alpha": 1,
//      "beta": 2,
//      "zoo": { "animals": ["zebra", "elephant"] }
//    }

使用 Python sort_keys=True 排序 + 数组排序

python
import json

data = {"zoo": {"animals": ["zebra", "elephant"]}, "alpha": 1, "beta": 2}

# 序列化时按 sort_keys 自动按字母序排
sorted_json = json.dumps(data, indent=2, sort_keys=True, ensure_ascii=False)
print(sorted_json)

# 数组按值排序
arr = [3, 1, 4, 1, 5, 9, 2, 6]
print(sorted(arr))          # 数字升序
print(sorted(arr, reverse=True))  # 降序

# 字符串字典序
print(sorted(['banana', 'Apple', 'cherry']))  # ['Apple', 'banana', 'cherry']

使用 jq 按键名排序

bash
# 按键名递归排序 + 2 空格缩进
jq -S '.' data.json

# 解释: -S (--sort-keys) 把所有对象键按 ASCII 升序递归排序

# 数组按元素字符串字典序排序 (对象会按 JSON 字符串比较)
jq 'sort' data.json

# 数组按某个字段排序 (例如按 age 升序)
jq 'sort_by(.age)' data.json

# 降序
jq 'sort_by(.age) | reverse' data.json

常见问题

JSON 排序和 JSON 格式化有什么区别?

JSON 格式化只调整缩进、换行、空白字符,不改变键的顺序;JSON 排序则会重新排列键名(按字母序)或数组元素(按值大小)的物理顺序。两者经常配合使用:先排序让结构整齐,再格式化让内容易读,最终输出最规范的 JSON。

排序后的 JSON 体积会变大吗?

字节数基本不变。排序不增删字段,仅重排键名顺序,序列化后字符数与原 JSON 几乎相同(缩进字符可能有 1-2 字节差异)。

会改变字段值或字段类型吗?

不会。本工具是纯结构重排:对象键名换序、数组元素换位、值和类型一律不动。`null`、布尔、数字、字符串、对象、数组的相对语义全部保留。

支持按值排序对象键吗?

本工具当前支持两种模式:① 按键名字母序排序(对象的键名换顺序);② 按值对数组元素排序(数组内元素换位)。如需按对象的某个字段值排序数组元素,请先用 JSON Path 工具抽取该字段到顶层数组再用数组模式排序。

递归排序是什么意思?要不要关掉?

递归 = 对嵌套对象每一层级都做键名排序;非递归 = 只对最外层对象的键名排序,子对象保持原顺序。绝大多数场景建议保持递归开启,能获得整齐一致的结构。仅当你的内层对象有特定顺序语义(如配置中的"优先级列表")时,才需要关闭递归。

为什么我的 JSON 整数键被排到最前面?

这是 JavaScript 规范行为:当对象的键看起来像非负整数(0、1、2...)时,引擎会按数字升序迭代,整数键会排在字符串键前面。本工具的排序结果会保留这个特性。如希望"看起来像整数的键也按字符串顺序排",可先用 JSON 修复或编辑器把它们改为 "0"、"1" 等带引号的字符串键。

中文键名能按拼音排序吗?

能。本工具底层使用 JavaScript 的 localeCompare,默认按当前浏览器的 locale 排序。中文环境下基本按拼音升序,但具体行为与浏览器和操作系统相关;如需严格 Pinyin 排序,可换用支持 ICU 排序规则的 Node.js 库(如 `natural-orderby`)。

数组里的对象怎么排序?

数组模式支持把数组里的对象按"序列化后字符串的字典序"排序,这意味着对象会按第一个不同字段的字符串值排序。如需按某个具体字段排序(如 price、date),建议先在 JSON Path 工具中用 sort-by 类操作,或在代码里用 `Array.prototype.sort((a, b) => a.price - b.price)`。

排序后能撤销恢复原顺序吗?

本工具不维护原顺序历史(出于简化考虑)。建议:① 修改前先复制一份原文到剪贴板;② 把原文保存为 .json 文件以便回滚;③ 在生产环境用 git 管理原始文件,需要时可 `git checkout` 任意历史版本。

排序后的结果可以导出保存吗?

可以。点击「下载」保存为 sorted.json 文件;或点击「复制」把结果放入剪贴板粘到代码、文档中。下载文件是标准 JSON,可被任何编辑器、IDE、CI 工具消费。

工具会上传我的 JSON 到服务器吗?

不会。解析、排序、格式化全部在浏览器本地完成,输入与中间结果不发送到任何服务器。可离线使用,适合处理含敏感信息(如内部配置、未公开 API 响应)的 JSON。

和 JSON Diff、Schema 校验配合使用的最佳顺序是什么?

推荐链路:① JSON 修复(清洗非法 JSON)→ ② JSON 排序(统一键名顺序)→ ③ JSON Diff(基于排序结果做差异对比,diff 噪音最小)→ ④ JSON 格式化(统一缩进可读性)→ ⑤ JSON Schema 校验(业务字段约束)。按需选择其中几步即可。

故障排查

排序提示 "Invalid JSON" 错误

原因:输入不是合法 JSON。解决方法:先把 JSON 粘贴到「JSON 修复」工具清洗(自动处理尾逗号、单引号、未加引号键等),再回到本工具排序;或检查是否漏写了外层大括号 / 方括号。

排序后整数键被排到最前面

原因:JavaScript 规范对"看起来像非负整数"的键按数字升序迭代。解决方法:把整数键改为字符串键("0"、"1")再排序;或接受此行为、把它视为一个特性。

数组内对象没按我希望的字段排序

原因:数组模式按"序列化后字符串字典序"排序,第一个不同字段决定最终顺序。解决方法:先在 JSON Path 工具中用 sort-by 类操作;或在代码里用 `arr.sort((a, b) => a.field - b.field)` 自定义比较函数;本工具主要面向键名排序场景。

中文键名排序结果不符合预期

原因:localeCompare 在不同浏览器/操作系统的行为略有差异,对中文默认按 Unicode 码点或浏览器 locale 排序。解决方法:在代码中显式指定 locale(如 `localeCompare('zh-CN')`);或换用支持 ICU 排序规则的库以获得严格的 Pinyin 排序。

嵌套对象的内部没排序(只外层排了)

原因:底部选项栏中的「递归」未勾选。解决方法:勾选「递归」开关(默认已勾选),重新触发排序;这样内层对象的键名也会按字母序排列。

大文件(10 MB+)排序卡死

原因:浏览器一次性 JSON.parse 大文本会占用大量内存。解决方法:把输入控制在 1-2 MB 以内;在本地用 Node.js(`Object.keys(...).sort()`)或 Python(`json.dumps(..., sort_keys=True)`)脚本处理超大文件;处理完再用本工具做小幅验证。

术语表

JSON Sort
把 JSON 对象键名按字母序重排,或把数组元素按值重排;不改变任何字段值或类型,仅重排物理顺序。
localeCompare
JavaScript 内置的字符串字典序比较函数,返回 -1/0/1;本工具用 localeCompare 对键名排序,对中文/特殊字符/emoji 都能正确比较。
ASCII 升序 / 降序
按字符的 Unicode 码点(ASCII 表)排序;大写字母 A-Z 在小写字母 a-z 之前,数字 0-9 在字母之前。
locale-aware Sort
考虑语言习惯的排序;对中文默认按 Unicode 码点或浏览器 locale,与严格的 Pinyin 排序有差异。
整数键 (Integer-like Key)
看起来像非负整数的对象键名(如 "0"、"1"、"2"),JavaScript 引擎会自动按数字升序迭代;规范行为,不可关闭。
递归排序 (Recursive Sort)
对嵌套对象的每一层级都做键名排序;本工具默认开启,关闭后只排最外层。
Canonical Form
规范化形式;JSON 排序是构造 canonical form 的一种手段,便于 diff、缓存 hash、跨环境一致。
Git Diff 噪音
代码 review 中由格式差异(而非真实逻辑变更)产生的 diff 行;键名顺序不同的 JSON 提交会大量产生噪音 diff。
pre-commit Hook
Git 提交前自动执行的钩子脚本;很多团队在 pre-commit 里调用 `jq -S .` 把 JSON 文件键名排序后再 add,保证仓库内 JSON 顺序一致。
JSON Diff 工具
对比两个 JSON 找出差异的工具(如 jsondiffpatch);建议先对两边 JSON 排序再 diff,能消除键名顺序造成的假差异。

JSON 排序场景与排序方法对照表

场景排序依据推荐实现对应工具
减少 Git Diff 噪音对象键名字母序jq -S本工具 / jq
配置中心规范化对象键名字母序jq -S本工具 / jq
API 响应缓存键对象键名字母序JSON.stringify(sort_keys=True)本工具 / Python json
分页 API 数组合并不排序concatJSON Merge 工具
按创建时间排数组成员数组元素 .created_atjq 'sort_by(.created_at)'jq sort_by
按价格排商品数组元素 .pricelodash _.sortByJS sort((a,b)=>a.price-b.price)

JSON 排序 vs JSON Diff vs JSON Merge

工具解决什么问题排序维度通常配套使用
JSON 排序(本工具)统一键名/数组顺序键名 / 数组元素JSON Diff、JSON Merge
JSON Diff对比两个 JSON 找差异无(基于内容比较)排序(先排序再 diff)
JSON Merge多源合并可按需排序合并排序(合并后排序归一)
JSON 修复把非法 JSON 转为合法排序(修复后排序归档)
JSON Schema 校验字段约束校验可基于排序后结果校验

Authoritative References