开发者工具·语法转换器
JSON 是否有效 YAML? YAML 1.2 的承诺以及它的破坏之处
· 背景
json yaml 数据格式
YAML 1.2 的设计使得每个 JSON 文档也是一个 YAML 文档,这就是为什么 JSON 到 YAML 的转换感觉微不足道。这篇文章解释了规范实际保证的内容以及承诺失败的边缘情况。
将 JSON 粘贴到 YAML 文件中并摆脱它 - 为什么它有效,并且有一次它不起作用
普通的 JSON 对象可以粘贴到 YAML 源端并在 ToolAcre 的 YAML 1.2 JSON 模式下读取。大括号、括号、带引号的键、字符串、数字、布尔值和 null 成为相同的纯 JavaScript 值。这就解释了为什么边界常常让人感觉微不足道。
保证应保持特定于解析器。 ToolAcre 限制标签、限制别名和嵌套,并应用输入限制。文本可以在更广泛的 YAML 处理器下有效,但由于与其 JSON 外观核心无关的安全或形状原因而被拒绝。
普通 JSON 通过此 YAML 1.2 读卡器加载;不受支持的扩展因不同原因而失败
选定的模式生成 JSON 形状的值:字符串、数字、布尔值、null、数组和映射。这种对齐方式支持解析然后序列化,而不是标点符号替换。源代码并未建立 YAML 规范的所有措辞或勘误表,因此本文报告了经过测试的行为,而不是声称完全符合。
在严格模式下,波形符、空值和 `0o755` 保留字符串。这些是 YAML 令牌,JSON 本身不会包含。核心以不同的方式解析它们,同时仍然返回 JSON 形状的输出。
提供的模式与 JSON 形数据对齐,无需证明每个规范边缘
重复的 YAML 映射键保留最后一个值并带有警告;其他地方的严格解释可能会拒绝它们。旧版 YAML 1.1 读者可以以不同方式键入诸如 `NO` 之类的单词,而本阅读器将它们保留为字符串。这些差异使广泛的可移植性声明变得复杂。
用作缩进的制表符会产生错误,而带引号的 JSON 字符串内的制表符会被转义。非常深或过大的值可能会达到当地的安全上限。理论语言关系不会超越实现边界。
重复键和遗留解析器差异仍然是互操作性边界
对于这个值管道来说,相反的情况显然是错误的。 YAML 注释没有 JSON 表示,别名解析为重复数据,多文档流变成数组,并且拒绝不支持的标签。块标量变成字符串,但它们的表示丢失。
因此,即使受支持的 YAML 文档也可以转换为有效的 JSON 并且永远不会返回相同的 YAML 文本。对于普通值来说,数据平等可能会存在,而注释、锚点、拼写和流标识则不然。
这对于转换意味着什么 — JSON 到 YAML 是样式更改,YAML 到 JSON 是可能丢失信息的翻译
JSON-to-YAML 通常是 JSON 形状输入的样式和序列化更改。 YAML-to-JSON 首先解释 YAML 特定语法,然后将结果投影到 JSON 的较小值模型中。方向不对称。
ToolAcre 测试包含嵌套值、Unicode、空值、数组和模糊字符串的普通 JSON-to-YAML-to-JSON 文档。这些装置证明了所覆盖的数据类,而不是每个可能的 JSON 或 YAML 处理器对。
工作示例:加载为 YAML 的 JSON 文档 — 相同的结构,然后添加仅 YAML 的功能以显示 JSON 工具停止的位置
将 `{"country":"NO","items":[1,null],"nested":{"ok":true}}` 粘贴为 YAML 输入。严格的读者返回同一棵树。添加 YAML 注释,注释消失时该值保持不变。用锚点和别名替换重复的对象; JSON 现在包含副本而不是引用语法。
添加 `---` 和第二个文档;结果成为带有警告的文档数组。添加`!!binary`;受限制的读者拒绝它。每个步骤都标记了一个明显的边界:忽略的表示、解析的结构、流约定和不支持的类型。
这不包括 - 模式级兼容性,其中 YAML 类型(如时间戳)没有 JSON 对应项
模式兼容性不仅仅与表面语法有关。核心可以创建 Infinity 或 NaN,JSON 将其写入 null 并发出警告。时间戳和二进制标签在受限模式下被拒绝而不是被转换。 ToolAcre 故意将 YAML 缩小为安全的 JSON 形状的数据。
另一个 YAML 实现可能支持其他类型。这使得它在这些点上与普通的 JSON 值不太兼容,不会自动变得更好或更差。根据目标合同和安全要求进行选择。
模式级兼容性包括此受限读取器限制或拒绝的非有限值和时间标记
普通 JSON 形状的数据干净地通过此 YAML 1.2 读取器和写入器。关于所有文档或解析器的更广泛的声明需要涵盖重复键、模式版本、标签和资源限制的固定装置。
使用语法转换器来测试实际文本并阅读其警告。仅在命名解析器、模式和使真实边界精确的不受支持的功能之后,才将“JSON is YAML”视为有用的简写。
对于可移植性测试,将一个灯具完全保留在 JSON 的价值模型内,而另一个灯具一次仅添加一个 YAML 功能。通过每个目标消费者运行这两者。第一个衡量实际子集主张;第二个准确识别注释、别名、流、标签或标量规则的分歧点。这种分阶段的方法比询问两种语言是否是抽象的子集更能提供信息,因为它会产生与系统实际使用的解析器相关的失败。