Pull请求有240行更改,我碰了恰好两个值,那是我认真地对JSON键进行排序的那一刻,一个队友通过格式化程序运行了一个配置文件,重新排序了它的键,我手工编辑了其中两个值,由此产生的diff是一面不可读的红色和绿色墙,其中238行是简单移动的键,我的审稿人,可以理解的是,让我重做它真正的变化在噪音内部是看不见的。
行[toolz。dev](/并且还构建了Laravel和WordPress项目,这意味着我住在里面 package.json、 composer.json、 tsconfig.json、翻译目录,以及致力于版本控制的其他一百个 JSON 文件。具有不可预测密钥顺序的 JSON 文件是其中每一个都需要缴纳的小额经常性税。将密钥排序为稳定的字母顺序是修复,它是那些看起来很漂亮的更改之一,直到第一次它可以为您节省浪费的代码审查。本指南涵盖了何时对 JSON 密钥进行排序、何时不对密钥进行排序以及如何在不破坏任何内容的情况下进行排序。
TL;博士: JSON 排序器将对象's 键按字母顺序重新排序,并将结果重新序列化 键顺序不会改变 JSON 的意思,因为对象是 JSON 标准无序的,但一致的顺序使文件可读,并产生干净的版本控制差异,仅显示更改的值 递归排序以到达嵌套对象,默认情况下保持数组顺序 因为数组是有序的,并选择升序或降序、漂亮或最小化的输出。 json分拣机 完全在您的浏览器中运行。
什么是 JSON 分拣机?
JSON排序器取一个JSON对象,将其键按字母顺序重新排列,然后将对象写回,值未被触及,只有键出现的顺序发生变化,那是安全的,因为 RFC 8259 将对象定义为无序集合:重新排序键不能改变文档的含义。所以 {"name":"toolz","author":"Liton"} 变成 {"author":"Liton","name":"toolz"}。默认情况下,排序是递归的,这意味着每个嵌套对象内部的键也被排序,一直到最深的级别。
That 是整个操作,它的简单性是重点,你不是在转换数据,验证一个模式,或者转换一个格式,你是在对某个具有任意一个的对象强加一个可预测的顺序,其他每一个好处,可读性,可比性,干净的差异,都从那个单一的可预测的顺序中流出。
排序键会改变我的JSON的意思吗?
No,而这正是使得排序安全的事实,在JSON标准ECMA-404中,一个对象被定义为一个无序的名称和值对集合,规范中明确指出那些对的顺序并不重要,任何符合的解析器读取 {"a":1,"b":2} 並 {"b":2,"a":1} 正如完全相同的数据一样。当你的程序这样做时 config.timeout 或 data["name"]者,它按名称查找键;它从不在乎该键写在对象中的哪个位置。
有一个警告值得明确说明,因为总是有人问。极少数系统滥用 JSON 对象,就好像它们被订购一样,依赖插入顺序进行显示或处理。那是对格式的滥用,而不是其属性,但如果您正在向您不控制的系统提供信息,请在将已排序的文件提交到您无法检查的管道之前进行测试。对于现实世界中的绝大多数 JSON、config 文件、API 有效负载、锁定文件、翻译目录、排序键是一种纯粹的呈现变化,对含义的影响为零。
Arrays相反的情况,区分很重要,一个JSON数组是按定义排序的,它的顺序经常带有意义:一系列步骤,一个排名列表,一组坐标,其中位置一是经度,位置二是纬度,重新排序一个数组可以默默地改变数据所说的内容,这就是为什么这个工具默认保留数组顺序,只有在你明确要求时才对数组进行排序,即使这样也只对元素都是字符串或所有数字的数组进行排序。
为什么要对 JSON 键进行排序?
headline 原因是 clean diffs,而它就是改变我工作方式的那个版本控制工具逐行比较文件,当两个代表相同数据的文件以不同的顺序写入它们的键时,diff 充满了移动的键而不是改变的值,采用每个 JSON 文件都用排序键写入的规则,问题就消失了:两个版本的文件仅在值实际不同时才不同,因此审阅者会立即看到真正的更改,这正是许多 linter 和格式化程序提供排序键选项的原因,也是工具喜欢的原因 jq 运送分类键旗帜。
2个原因是人类的可读性,当你扫描一个大的配置文件寻找一个特定的设置时,按字母顺序告诉你要去哪里看,你不读整个文件;你跳到大概键应该在哪里,就像在字典里八十个键的文件上,那就是两秒查找和全扫描的区别。
3个原因是跨文件的可比性,如果你的项目有十个JSON文件,应该都共享一个共同的结构,那么对它们进行一直排序,无论一个缺少一个键还是多了一个键,都对眼球的分歧彼此排成一排,而不是隐藏在不同的位置。
4个原因是规范化,有些工作流需要一个稳定的、确定性的JSON值表示,例如哈希它、缓存它,或者比较两个有效负载,无论它们是如何序列化的,它们都是相等的。排序键是朝着规范形式迈出的一步,尽管完整的规范JSON也规范了空白和数字格式化。
如何使用 JSON 分拣机?
将您的 JSON 粘贴到输入框中 json分拣机(或加载样本),以查看输出的形状,输入必须是有效的 JSON,如果不是,工具会报告其位置的解析错误,这样您就可以在排序前修复一个杂散逗号或未关闭的括号。
然后选择排序如何运行。选择升序,即 A 到 Z,或将 Z 降序到 A。决定是否折叠大小写,默认情况下为打开状态,以便 Name、 name、和 NAME sit together而不是被分开,因为大写字母排序在小写字母之前,按照原始字符顺序。选择是下降到嵌套对象中,这是你几乎总是想要的,还是只排序顶级。如果你也想要字符串数组或数字排序,打开数组排序;混合数组和对象数组总是保持原样。
最后,选择您的输出样式。使用两空格、四空格或选项卡缩进的漂亮打印来对您将提交的可读文件进行打印,或者最小化到单行以获得最小的有效负载以进行存储或传输。运行排序,然后复制结果或下载。按键计数告诉您重新排序了多少个按键,这是一种快速的理智检查,该工具是否看到了您期望的结构。
上升、下降、递归:我想要哪些设置?
Most of the defaults is what you want: ascending, recursive, case-insensitive, pretty-printed with two space。that produces the readable, diff-friendly file that motivated sorting in the first place。other settings existed for specific situations, and the table for who I decision。
| 设置 | 默认 | 何时更改 |
|---|---|---|
| 命令 | 上升(A 到 Z) | 降序很少见;当您想要最新或最高优先级的键(指定最后排序)位于顶部时,它很有用 |
| 递归 | 论 | 仅当您想要重新订购顶级部分但保留每个部分内部手动调整的顺序时才关闭 |
| 忽略案例 | 论 | 当您需要严格的代码点顺序时关闭,例如匹配另一个区分大小写的工具 |
| 对数组进行排序 | 关闭 | 打开真正无序集的数组,例如标签列表或允许值 |
| 漂亮的印刷品 | 论 | 关闭以尽量减少运输或储存 |
人们误用的一个设置是数组排序,只有在确定时才打开它 数组代表无序集合 标签列表、允许的文件扩展名集合或一袋特征标志可以安全地排序 管道步骤列表、路线表或任何位置暗示序列不存在的内容 当有疑问时,请不要打扰数组,因为工具'默认保存顺序永远不会损坏您的数据,而默默排序错误的数组可以。
这与其他 JSON 工具如何配合?
排序通常是小链中的一步。当 JSON 从 API 收到简化的且无法读取时,我会运行它 JSON 格式化程序 先缩进验证,然后对键进行排序,使其可扫描,当我排序后准备有效载荷进行传输时,the JSON 迷你器 将其缩减为一行,并且由于密钥已经排序,因此代表相同数据的两个最小化有效负载逐字节显示相同,这对于缓存和比较很方便。
对于结构工作而不是演示, JSON 扁平化剂 将嵌套对象转换为虚键并返回,当您将配置拼写为环境变量时,它会自然地与排序配对。当您完全需要另一种格式的数据时, JSON 到 YAML 转换器 是下一站;在转换之前排序键,也给您一个具有可预测的,可读字段顺序的YAML文件,如果您想要这些如何组合在一起的更大图片,我在中布置了我的全套设置 web开发人员工具包指南并且格式化的更深层次机制存在于 JSON 格式化程序指南。
一个真正的例子:驯服一个包。json diff
让我浏览一下本文开始的确切情况,因为它说明了为什么设置选择很重要。我有一个 package.json 哪里 dependencies block 是按照安装顺序编写的,大致是两年多来添加包的顺序。一位新的团队成员运行他们的编辑器's 保存格式,对依赖项进行排序,并将其与真正的更改一起提交:将一个包从版本 4 碰到版本 5。
diff 是个灾难,在被碰撞的下面每个依赖项似乎都移动了,因为排序已经转移了他们的位置,所以审稿人看到三十行更改了什么是单行升级,修复不是争论谁的编辑器是对的,修复是排序文件一次,提交那个排序作为自己的单独更改,并带有像 " sort package。json 键," 然后在现在稳定的顺序之上做版本碰撞,之后,未来的每个依赖项更改都会产生一个干净的一行或两行 diff,因为文件已经按照每个人 's 工具想要放入的顺序。
这就是我现在对任何生活在版本控制中的 JSON 所遵循的模式。在专用提交中对其进行一次排序,然后保持其排序。 json分拣机 默认值是上升的和递归的,恰好产生了 Prettier's 排序选项的顺序 jq --sort-keys produce,所以不管队友碰巧跑哪个工具,文件都保持稳定,我首先检查的一件事就是数组: package.json 没有有意义的数组需要担心,但具有有序数组(例如构建步骤列表)的文件需要对已关闭的数组进行排序,这是默认值,因此序列仍然存在。
哪些工具和格式对 JSON 键进行排序?
JSON 键进行排序是足够普遍的需求,它会出现在整个生态系统中,这是一个好兆头,表明这种做法是合理的,而不是个人的怪癖。命令行处理器 jq 有一个 --sort-keys 旗帜,经常写 -S的,它对其输出中每个对象的键进行排序 Prettier 代码格式化程序可以通过其配置对 JSON 中的键进行排序 许多 linter 提供了一种排序键规则,该规则在源代码中标记未排序的语言标准库,从而暴露出相同的功能,例如 Python's json.dumps 接受a sort_keys=True 产生规范、排序输出的参数。
基于浏览器的排序器添加的是快速、无设置的情况。当您从 API 响应、日志行或 Slack 消息中获取一团 JSON,并且您现在只想按理智的顺序阅读时,打开页面和粘贴比接线格式化程序或放入 shell 更快。这也是粘贴格式化程序与编辑器插件一起存在的原因:该工具满足了配置的管道未涵盖的临时需求。
我的 JSON 是私人的吗?
是的。JSON 完全在您的浏览器中使用 JavaScript 进行解析、排序和重新序列化。任何内容都不会上传到服务器、记录或存储在任何地方。这对于 JSON 来说并不是一个小细节,因为 JSON 是秘密所在的地方:携带令牌的 API 响应、带有连接字符串的配置文件、包含客户记录的有效负载。将其中任何一个粘贴到将其运送到服务器的工具中都是真正的风险,而这正是该工具构建以避免的风险。
您可以像我一样验证索赔。打开浏览器中的网络选项卡's 开发人员工具,并在您排序时观看它;没有请求离开页面。或断开与互联网的连接并继续排序,因为一旦页面加载,该工具完全不连接。客户端处理是我构建的所有内容的默认值,如果您关心更广泛的论证,则 数据隐私指南 充分说明情况。
常见问题
对JSON键进行排序是什么意思?
JSON键排序,将一个对象的名称-值对重新排序为字母顺序,而不改变任何值,对象{"name":"toolz","作者":"立顿"}变成{"作者":"立顿","name":"toolz"}。只有键的顺序发生变化,所以文档所代表的数据保持完全相同。
排序键会改变我的JSON的意思吗?
不 。 在JSON标准ECMA-404中,对象是一组无序的名称-值对,因此重新排序其键不会改变其含义。 任何符合的解析器都将排序和未排序的版本读取为相同的数据。 该命令仅对人类的可读性和产生稳定的差异很重要。
嵌套对象是否也被排序?
是的,默认情况下。 递归排序是开启的,因此文档中每个对象的键都被排序,在嵌套的每个级别。 您可以关闭递归以仅对顶级键进行排序,并按原始顺序保留嵌套对象。
排序器是否重新排序数组?
不是默认的。 数组是按定义排序的,重新排序它们可以改变含义,因此该工具保留了数组的顺序。 当您确实希望对它们进行排序时,可以选择对元素为所有字符串或所有数字的数组进行排序;混合类型或包含对象的数组始终保持原样。
为什么要对 JSON 键进行排序?
最常见的原因是稳定差异:当每个文件按字母顺序写入其键时,版本控制差异仅突出显示更改的值,而不是移动的键。 排序还使大型配置文件和 API 响应更容易扫描和通过眼睛进行比较。
区分大小写的排序如何工作?
对大小写不敏感的排序,键会被比较,就像小写,所以名称,名称和名称彼此相邻而不是分开,因为大写字母在原始字符顺序的小写字母之前排序。 关闭它以严格按字符代码点排序。
我可以最小化排序的JSON吗?
是的。 选择最小化输出以在没有额外空格的单行中获取排序的 JSON,这是存储或传输的最小形式。 对于可读文件,请选择具有两个空格、四空间或制表符缩进的漂亮输出。
我的json是否上传到任何地方?
不 。 JSON 在浏览器中由 JavaScript 解析和排序,并且永远不会传输、记录或存储。 您可以通过在排序时查看网络选项卡或脱机来验证此工具,该工具在没有连接的情况下继续工作。
由[toolz。dev]的构建者Liton编写(/。我构建基于浏览器的开发人员工具,并撰写有关与JSON、Laravel和网络合作的文章。



