JSON Key 递归排序(A-Z / Z-A)
递归重排所有层级的键名,让两份只有字段顺序不同的 JSON 变成可以逐行比对的一致结构。
同一份数据经过不同序列化器、不同语言或不同版本的客户端处理后,字段顺序经常不一样,直接做文本比对会得到一片红绿,而实际数据完全等价。把两侧的 key 按同一规则重排,差异就会收敛到真正变化的字段上。这个工具递归处理所有层级的对象,而不是只排顶层键。
排序需要先解析 JSON,所以输入必须是合法文本,解析失败时会直接提示语法错误,不会输出半成品结果。处理在浏览器本地完成,两份待比对的数据都不出本机,适合内部接口返回的订单、用户资料这类不适合外发的内容。
排序规则与作用范围
排序是递归的:对象内部按键名重排,数组本身不重排,因为数组顺序就是数据的一部分,把列表元素按字母排列会破坏语义;但数组里每个元素如果是对象,元素内部的键同样会被排序。比较使用语言环境相关的顺序,而不是简单的字节码比较,因此大写字母与小写字母的先后和 ASCII 码表并不一致,数字开头的键名通常排在字母之前。中文键名也按同一套规则排序,具体结果由浏览器语言环境决定。
为什么能减少假差异
JSON 对象的键本身是无序的,标准只保证解析结果包含这些键,不承诺顺序,所以 {"a":1,"b":2} 与 {"b":2,"a":1} 在语义上相等。差异比对按行比较,键序不同会把每一行都标成变化;先排序再比对,就能立刻看出到底哪个字段的值改了。本站的差异对比功能内置了同样的 Key 排序比对按钮,两边一起处理的效果与这里一致。
输出形式与适用场景
排序结果统一按 2 空格缩进输出,也就是顺带完成了一次格式化,原始缩进不会保留。典型用途有三个:比对两份接口响应、把配置文件规范成统一风格后再入库、生成稳定的快照用于自动化测试,让断言不会因为字段顺序抖动而失败。需要提醒的是排序会永久改变文本顺序,如果依赖原顺序输出(例如展示型配置的字段次序),请先复制原文再操作;同一个对象里重复的键在解析阶段就已被后一个覆盖,排序也无法还原。
常见问题
- 排序会打乱数组里的元素顺序吗?
- 不会。数组顺序被视为数据本身,工具只递归处理数组元素内部的对象键,元素之间的先后关系完全保持原样。所以商品列表、日志条目这类需要保持顺序的数据可以放心排序,不必担心列表被重排。
- 排序结果为什么和预期的大小写顺序不一样?
- 因为比较遵循语言环境规则而不是 ASCII 码位。按码位排序时所有大写字母都在小写字母之前,B 会排在 a 前;按语言习惯排序时大小写交错,更接近字典顺序。如果需要严格的码位顺序,可以在排序后手工调整个别键。
- 中文键名会怎么排?
- 中文键名按浏览器语言环境的排序规则处理,现代浏览器在中文环境下通常按拼音顺序排列,但具体结果取决于系统语言与实现版本,不同浏览器可能不一致。如果排序结果要作为稳定快照参与测试断言,建议键名统一使用英文。
- 排序和格式化有什么区别?
- 格式化调整的是空白与缩进,键的先后不变;排序调整的是键的顺序,同时把输出统一成 2 空格缩进,所以排序的结果一定是格式化过的,反之不成立。只想对齐缩进时用格式化,需要消除键序差异时用排序。