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,前后端共用同一份规范化样本。
使用方法
- 把需要排序的 JSON 内容粘贴到左侧输入框,或点击「示例」加载一个典型多层级 JSON,或上传 .json/.txt 文件
- 在底部选项栏中选择排序模式:默认「按键名排序」;如需对数组内元素排序,切换到「按数组排序」
- 根据需要切换升序 / 降序按钮,勾选或取消「递归」选项(默认开启)
- 点击「排序」按钮,右侧输出框会显示排序后的格式化结果;点击「复制」或「下载」保存为 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 排序 + 数组排序
pythonimport 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 数组合并 | 不排序 | concat | JSON Merge 工具 |
| 按创建时间排数组成员 | 数组元素 .created_at | jq 'sort_by(.created_at)' | jq sort_by |
| 按价格排商品 | 数组元素 .price | lodash _.sortBy | JS 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
- JSON 压缩
- CSV 转 JSON
- JSON 转 CSV
- JSON Diff
- JSON Escape / Unescape
- JSON扁平化
- JSON 格式化
- JSON 生成器
- JSONPath 查询
- JSON 合并
- JSON 修复
- JSON Schema 校验
- JSON 排序
- JSON Stringify
- JSON 转 HTML
- JSON 转 Java
- JSON 转 Markdown
- JSON 转 SQL
- JSON 转 TOML
- JSON 转 TypeScript
- XML 转 JSON
- JSON 转 XML
- YAML 转 JSON
- JSON 转 YAML
- JSON 转 Python
- JSON 转 Go
- JSON 转 Rust
- JSON 转 Swift
- JSON 转 C#
- JSON 转 C++
- JSON 转 PHP