开发者工具·语法转换器
YAML 到 JSON 类型强制: yes、no 和 0777 如何改变含义
· 工作原理
yaml json 数据格式
YAML 将未加引号的标量解析为类型,并且 YAML 1.1 和 1.2 之间的规则有所不同。这篇文章准确地展示了转换器如何确定一个值是布尔值、整数、浮点数还是字符串,以及如何控制结果。
返回为 true 的值 — 一个普通的 YAML 标量,表示文本,转换为 JSON 作为布尔值,然后服务出现错误
诸如 `NO` 之类的值在 YAML 1.1 加载程序中可能会变为 false,但这不是此转换器所提供的。两种 ToolAcre 选择都使用 YAML 1.2 模式,因此 `NO`、`yes`、`no`、`on` 和 `off` 仍然是字符串。更正的开头很重要,因为声称该面板将 `NO` 变为 true 或 false 的示例将教导与其测试行为相反的内容。
类型惊喜仍然存在。在默认的 JSON 模式下,`null` 为 null,而 `~`(空值)和 `0o755` 仍为字符串。选择 Core 会将这三种形式更改为 null、null 和 493。输出非常有用,因为它公开了已解析的 JavaScript 值,而不是假装每个普通 YAML 标记都带有明显的类型。
保留文本在 YAML 1.2 下的值
js-yaml 读取源代码时会发生隐式解析。在转换器写入 JSON 之前,所选的受限模式决定普通标量是否与空值、布尔值或数字形式匹配。引用绕过了这个决定: `"0o755"` 是任一模式下的文本,块标量仍然是一个字符串,包括由其 chomping 指示符表示的换行符。
这是解析和序列化,而不是正则表达式替换。读者构建字符串、数字、布尔值、空值、数组和对象; `JSON.stringify` 然后发出具有所选缩进的这些值。注释和标记拼写已经在写入阶段消失,因此没有序列化程序可以重建数字是否最初是十进制的或以另一种可接受的 YAML 表示法写入的。
YAML 1.1 规则 — yes/no/on/off 布尔值,0777 为八进制,1:30 为六十进制,版本字符串如 1.10 读为浮点数
大纲列出了 YAML 1.1 强制转换,例如六十进制时间和旧八进制。它们是相关的兼容性危害,但它们不是此处可用的模式。 ToolAcre 故意不提供 1.1 架构。它的 UI 表示,两个附带选项均未将 `NO` 读取为 false,并测试将该国家/地区代码和单词 yes、no、on 和 off 作为字符串固定。
该边界改变了调试方法。如果另一个应用程序将这些单词转换为布尔值,请将其解析器配置与 ToolAcre 进行比较,而不是期望相同的输出。转换器可以显示它自己的两个模式产生的结果;它无法验证稍后使用该文件的 CI 运行程序、框架或部署系统所使用的架构或版本。
YAML 1.1 强制转换是该转换器避免的危险
默认 JSON 模式仅接受与 JSON 模型兼容的标量拼写。 Core 添加了熟悉的 YAML null 形式、十六进制和八进制整数、Infinity 和 NaN。核心仍然停留在受限制的加载器内:特定于语言的对象标签、日期、集合、有序映射和二进制标签被拒绝而不是被构造。
无穷大和 NaN 揭示了另一个边界。 JavaScript 可以保存它们,但 JSON 无法写入它们。转换器识别每个路径并警告该值变为空。这是公认的有损步骤,而不是无损转换。带引号的 `.inf` 可以避免这种情况,因为该值仍然是文字字符串 `.inf`。
两个已发布的 YAML 1.2 模式仅在记录的标量形式上有所不同
粘贴 `tilde: ~`、`empty:`、`octal: 0o755`、`country: NO` 和 `answer: yes`。在严格选择的情况下,JSON 值为 `"~"`、`""`、`"0o755"`、`"NO"` 和 `"yes"`。选择 Core 后,只有前三个发生变化:波形符和空变为 null,八进制变为 493。国家/地区和答案在两个输出中均保留文本。
现在引用每个值并重复。两种模式都返回字符串,因为源声明了预期的类型。这种比较是代码准确的,并且比在从不加载 1.1 的工具中对比 YAML 1.1 与 1.2 更有用。它还提供了一个可审查的固定装置,用于检查另一个解析器,而无需仅根据其文档进行猜测。
工作示例:ToolAcre 严格模式和核心模式下的一个文件
仅当受限模式识别显式标准标记时,它们才会被接受:`!!str 123` 变为字符串 `123`,而 `!!int "7"` 变为数字 7。 `!!binary`、`!!timestamp`、`!!set`、`!!js/function` 等标签和 Python 对象构造函数将被拒绝。这可以防止 YAML 读取器成为任意对象工厂。
引用仍然是可移植的选择。它保留前导零、版本拼写和标记词,而不依赖于另一个工具中存在的显式标签。 JSON 结果显示所选类型,但它不能携带产生该值的引号样式或标记。
这不包括 - 对结果 JSON 的应用程序级解析,这可能会再次强制类型(例如,字符串 '1' 为数字)
应用程序代码可能会再次强制生成 JSON。 API 可以读取 `"1"` 并将其转换为数字,或根据架构拒绝它。语法转换器在生成 JSON 文本后停止;它不运行框架验证器、环境变量加载器或业务规则。因此,干净的转换证明了语法和映射,而不是最终服务的接受。
重复的 YAML 密钥是一个单独的问题。 ToolAcre 保留最后一个值并报告带有位置的重复键。多文档流变成数组。即使每个标量类型都是预期的,这些选择也可能会改变应用程序看到的内容,因此请阅读警告,而不是仅判断格式化的 JSON 主体。
要点:引用机器可能误读的任何内容 - 以及如何在浏览器中将 YAML 转换为 JSON 准确揭示每个标量解析的内容
引用类似于机器令牌的文本,然后检查 JSON 类型。当您想要最小的 JSON 形标量词汇时,请使用 strict;当需要 YAML null 和数字形式时,请故意选择 Core。这两个选项都不是 YAML 1.1,也不会让下游消费者遵循相同的规则。
该面板使其解析器选择可见,并针对没有目标可以表示的值返回警告。这是诚实的承诺:它揭示了该实现如何解决每个标量。它不声明通用 YAML 行为或通过往返保留注释、标签和拼写。