开发者工具 · JSON 格式化程序和验证程序
为什么尾随逗号会中断 JSON 以及验证器指向的位置
· 工作原理
json 开发人员工作流程 验证
尾随逗号是最常见的 JSON 错误,并且该错误永远不会出现在逗号本身上。了解逗号后语法的要求以及如何阅读所报告的位置。
需要十分钟才能找到的单字符错误
需要十分钟才能找到的单字符错误 - 手动编辑的配置,最后一个属性后留下的逗号,以及失败的构建。严格的解析器遵循文档中实际存在的标记序列。考虑一个以 `'enabled': true,` 结尾的对象和一个以 `'blue',` 结尾的数组:即使下一个标记关闭容器,两个分隔符都承诺另一个项目。
ToolAcre 不会从浏览器引擎消息中获取位置。 JSON.parse 首先判断有效性;仅在失败后,存储库扫描器才会遍历文本并报告第一个不可接受的字符。对于尾随逗号,该字符是右大括号或方括号,原因明确为“尾随逗号”。在对象中,缺少另一个带引号的成员名称;在数组中,缺少另一个完整值。
JSON 语法在逗号后表示什么
JSON 语法在逗号后表示的内容 — RFC 8259 使用逗号分隔数组中的值和对象中的成员。因此,分隔符的每一侧都需要一个有效的项目。在对象逗号之后,解析器需要一个双引号名称、一个冒号和一个值。在数组逗号之后,它需要任何有效的 JSON 值。结束定界符不满足这两种产生式。
分隔符属于两个成员或元素之间,而不是在最后一个成员或元素之后。删除最后一个逗号不会改变任何值或顺序;它恢复在其最终值之后直接关闭容器的语法。这也是为什么逗号可以毫无问题地出现在每个较早的项目之后:每个逗号后面都跟着它所承诺的下一个项目。
为什么错误出现在右括号上
为什么错误出现在右括号上 - 容器中间的逗号是合法的,因此解析器不能仅仅看到它就拒绝它。它使用分隔符并更改状态以期望另一个名称或值。仅当 `}` 或 `]` 到达时,矛盾才变得确定。即使前面的逗号导致了状态转换,该分隔符也是所承诺的项目被证明不存在的地方。
报告的分隔符是有关解析器状态的证据,而不是删除大括号或方括号的建议。读取左侧的一个标记。如果该标记是逗号并且分隔符关闭同一个容器,则删除逗号并保留关闭。 ToolAcre 的扫描器命名尾随逗号条件并在 JSON.parse 拒绝文档后提供源位置。
JavaScript、Python 和现代 linter 允许这样做,JSON 不允许
JavaScript、Python 和现代 linter 允许这样做,而 JSON 不允许——源语言文字通常允许在最后一项后使用逗号,因为它使重新排序的行和未来添加的内容更容易检查。格式化程序甚至可以插入或保留该样式。这些便利属于每种语言的语法。 `.js` 对象文字或 Python 字典可以是有效源,而相同的可见标点符号在 RFC 8259 JSON 文档中仍然无效。
当粘贴的片段以逗号结尾时,为 JavaScript 配置的编辑器可能不会显示任何警告。目标解析器仍然控制接受。对 `.json` 文本使用 JSON 语言模式,并验证发送到 API 或配置字段的确切负载。源文件、linter 或 JSON5 解析器中的宽大处理并不是关于严格 JSON 消费者的可转移证据。
工作示例:一个文件中的三个尾随逗号
工作示例:一个文件中的三个尾随逗号 - 假设 `features` 以 `"beta",` 结尾,其包含对象以 `"enabled": true,` 结尾,第二个根成员也有同样的错误。第一次验证在 `beta` 之后的右括号处停止。删除该逗号允许解析继续,直到 `true` 之后的右大括号,并修复第二个位置显示剩余的根级对象错误。
此序列是预期的,因为解析器通常报告不可能继续的第一个点,而不是每个后续缺陷。将每一行和每一列映射到其结束分隔符,检查其前面的分隔符,进行一项有意更改并再次运行验证。不要批量删除所有逗号:实际邻居之间需要分隔符。重复验证可将同一文档中的三个无效终端逗号与有效逗号区分开来。
产生相同错误的变体
产生相关分隔符错误的变体 - 一个前导逗号、一行中的两个逗号以及根值后面的一个逗号都滥用相同的字符,但违反了不同的解析器状态。前导逗号的左侧没有完成的项目。连续的逗号在分隔符之间不提供任何项目。在 JSON 文本已经到达有效结尾之后,完整根值后面会出现一个逗号。
这些情况不应自动标记为尾随逗号。确切的原因取决于位置和容器状态。在 `{"a":1,,"b":2}` 内部,第二个逗号是意外的,应该在引用的成员名称开始处出现。在 `[ ,1]` 中,第一个逗号出现在需要值的位置。检查诊断和周围的标记,而不是在结束分隔符模式之外应用通用的“删除前一个逗号”规则。
这不包括什么
这不包括什么 - JSON5 和一些 JSON-with-comments 工作流程故意允许尾随逗号。为这些语法之一编写的文件应该使用其声明的解析器、扩展名和工具。将其视为严格的 JSON 将产生反映格式不匹配的错误,而不一定是创作错误。相反,使用宽松的解析器接受它并不能使源安全地发送到严格的 JSON 端点。
更改解析器只是为了沉默此诊断会更改可接受的语言,并可能隐藏与最终消费者的不兼容性。注释、不带引号的名称和单引号字符串可能会在扩展格式中伴随尾随逗号,从而在文本跨越边界时产生额外的失败。首先确认目的地合同。如果显示 JSON,请删除扩展语法;如果显示 JSON5 或 JSONC,请使用实现该确切格式的工具进行验证。
要点:查看报告位置左侧的一个标记
要点:查看报告位置左侧的一个标记 - 当插入符号位于 `}` 或 `]` 下方时,前面的逗号可能已承诺从未到达的成员或元素。保留结构上必要的结束分隔符并仅删除该终端分隔符。然后再次验证整个文档,因为第一个修复的位置可能会在稍后的容器中发现另一个尾随逗号。
ToolAcre 缩小了职责范围:JSON.parse 决定文档无效,本地扫描仪在失败后提供稳定的结构原因以及行和列。使用该坐标来检查解析器上下文,而不是孤立地指责突出显示的字符。尾随逗号是单字符编辑,但了解为什么错误出现在以下分隔符上可以使跨对象、数组和深度嵌套配置的相同诊断变得可靠。