简体中文

开发者工具 · JSON 格式化程序和验证程序

JSON 漂亮打印的工作原理:缩进、空格和按键顺序

· 工作原理

json 开发人员工作流程 验证

JSON 漂亮打印的工作原理:用 JSON 标记和精确的验证边界说明缩进、空格和按键顺序
原始 ToolAcre 矢量图

漂亮打印只会改变无关紧要的空白,但人们担心它会改变他们的数据。这篇文章解释了格式化程序可以触摸的内容、如何应用缩进深度以及按键顺序会发生什么。

相同的数据,三种不同的外观

相同的数据,三种不同的外观 - 紧凑的 API 有效负载可以占用一行,在每个深度扩展两个空格,或者进一步扩展为四个空格。每个版本中的大括号、括号、名称和值都描述相同的解析结构。仅结构标记之间的换行符和间距不同。在查看格式化程序输出时,这种区别很重要:较大的差异并不自动导致数据更改,因为缩进故意更改许多字节,同时保持结果值不变。

ToolAcre 提供两个、四个或八个空格和一个制表符,然后将选定的缩进传递给 JSON.stringify。简短的嵌套部署记录使比较变得清晰:区域保持相同的数组顺序,布尔值仍然是布尔值,重试计数仍然是数字。

JSON 认为哪些空白不重要

JSON 认为哪些空格无关紧要 — RFC 8259 允许在结构字符之前或之后使用空格、水平制表符、换行符和回车符。因此,格式化程序可以在 `{` 之后放置一个换行符,在嵌套成员之前放置一个空格,并在 `}` 之前放置另一个换行符,而不更改该值。然而,空白并不是普遍可弃的。一旦双引号打开一个字符串,每个普通空格都属于该字符串的内容,并且必须在完全按照数据格式进行格式化后仍然存在。

最安全的心理模型是将标记边界与字符串内容分开。在冒号和数字之间,允许存在额外的空白。在引用消息的字母之间,它是信息。 ToolAcre 首先解析源并序列化结果值,因此 JSON.stringify 选择容器周围的新空格,同时保留解码的字符串字符。

如何应用缩进设置

如何应用缩进设置 — 每个嵌套容器都会添加所选缩进单元的一份副本。顶级属性从以下一层开始:其对象内的属性开始两个级别;数组中的对象添加了另一个级别。右大括号和中括号返回到拥有它们的容器的缩进。因此,宽度反映了结构深度,而不是键、值或前一行的长度。

空间在每个编辑器中创建固定的视觉宽度,而选项卡则允许每个查看者选择一个级别的显示宽度。 JavaScript 还将 JSON.stringify 缩进限制为十个空格字符或所提供字符串的前十个字符,尽管 ToolAcre 仅公开实用预设。

格式化是否会改变按键顺序?

格式化是否会改变按键顺序? - 普通的漂亮打印不会有意对对象成员进行排序。 JSON 对象在概念上是无序集合,但 JavaScript 解析和序列化使用定义的属性枚举规则。因此,大多数非整数键按其输入顺序出现,而类似整数的键可以在其他名称之前发出。消费者永远不应该将商业意义赋予成员位置,即使格式化程序似乎始终为熟悉的对象保留它。

ToolAcre 将缩进与排序分开。禁用排序后,它会直接序列化解析的对象。启用排序后,它会在 JSON.stringify 运行之前递归地构造其键按字母顺序排列的对象;数组保持其元素顺序,因为重新排序数组会改变其含义。这个显式选项做出了可审查的区别:仅空白输出来自漂亮打印,而键顺序差异来自请求规范组织。

解析和重新序列化格式化程序可以改变什么

解析和重新序列化格式化程序可以改变什么 - 解析后的值保留下来,但其原始拼写不会。写入 `1.0` 的数字可能返回为 `1`,而 `1e3` 可能返回为 `1000`。转义的可打印字符可以按字面重新出现,而当序列化需要时,字面字符可能会被转义。重复的对象名称在解析过程中已经折叠,因此只有最终的属性值可供格式化程序使用。

这些转换解释了为什么格式化输出不应被视为保留字节的文档编辑器。当语义等价为目标时比较解析的值,当原始符号对签名、散列或审核工作流程很重要时检查文本差异。非常大的整数需要特别小心,因为 JavaScript 数字在序列化之前可能会失去精度。

工作示例:格式化嵌套对象

工作示例:格式化嵌套对象 - 以 `{"service":{"regions":["sg","us"],"retry":{"count":3}}}` 开头并选择两个空格。左根大括号后面跟着一个换行符。 `service` 接收两个前导空格,其子属性接收四个,数组元素接收六个,嵌套的 `count` 属性也接收六个。每个逗号结束一个呈现的成员,每个结束分隔符与其打开容器的缩进级别对齐。

将相同的值切换到选项卡仅更改每个级别使用的前缀。打开键排序还可以将 `regions` 放置在 `retry` 之前,但数组仍然先读取 `sg`,然后读取 `us`。有用的审查分两遍检查输出:首先确认嵌套和数组顺序代表原始值,然后确定所选的空白是否适合存储库。

这不包括什么

这不包括什么 - 键排序是一个单独的规范化选择,而缩小是相反的表示操作。漂亮打印也永远不会授予重新排序数组的权限:数组位置是数据,因此更改它可以改变优先级、时间顺序或程序行为。缩进也不会使无效源在解析之前变得有效。注释、尾随逗号和仅 JavaScript 值必须由解析器针对其实际格式进行更正或处理,然后严格的 JSON 格式化程序才能序列化它们。

规范 JSON 方案比普通格式更进一步,它定义了精确的成员排序、数字拼写以及签名或确定性哈希的转义。 ToolAcre 并不声称实施这样的规范化标准。它使用 JSON.parse 和 JSON.stringify 生成可读的浏览器本地输出,并具有可选的递归键排序。

要点:漂亮打印是一种空白转换

要点:漂亮打印是一种空白转换——其目的是在不改变表示值的情况下公开结构。缩进宽度影响可读性、审查噪音和本地约定,而不影响 JSON 有效性。字符串内的空格仍然是数据,数组顺序仍然很重要,并且对象键排序需要单独的显式选择。记住这些边界可以使格式化程序差异更容易评估,并防止外观更改与语义编辑混淆。

解析和重新序列化工具仍然可以规范数字和转义拼写,因为它根据值而不是原始标记文本工作。当词汇保真度很重要时,请检查这些情况,并避免使用普通的漂亮输出作为签名的规范形式。对于日常配置和 API 检查,选择您的团队使用的缩进,除非需要,否则保留排序,本地格式化并验证发出的文本。