跳转到主要内容
CuteJSON
↑↓ 导航 Enter 选择 Esc 关闭

如何将JSON转换为YAML而避免经典的01234 bug

发布 1 分钟阅读 作者 Akash Kinkar Pandey

YAML 是比 JSON 大得多的语言。每个 JSON 文档都是有效的 YAML,但反 过来不成立,这意味着 JSON 到 YAML 转换器可以完全正确,而 YAML 到 JSON 转换器必须拒绝 YAML 中 JSON 无法表达的部分。

使用 JSON 到 YAML 转换器

选择方向和缩进宽度,然后点击转换。写入 YAML 时,映射变成每行一个 键,数组按项重复其短横线,null 变成完全没有值的键。

该工具特别防范的 bug

看起来像数字、布尔值或 YAML 指示器的纯标量在有人将文件解析回来时 会被误读为该类型。01234 邮政编码是经典案例:不加引号写入,YAML 解析器会将其读为数字 1234,前导零就永远丢失了。碰巧读作 "true" 或 "null" 的字符串也会遇到同样的问题。

转换

{"zip":"01234","active":"true","note":null,"id":12345678901234567890}

产生:

zip: '01234'
active: 'true'
note: null
id: 12345678901234567890

两个字符串值特意加引号,因为不加引号会在返回时改变其类型。实际的 null 不加引号写入,因为那是正确的无引号拼写。二十位的 id 完整保留,因为它通过令牌流而非 JSON.parse 解析的值。

读取器接受什么,拒绝什么

将 YAML 读回 JSON 时,该工具理解映射、序列、加引号的字符串、 块标量、流集合和折叠纯标量。它按名称拒绝锚点、别名和标签,而不是 静默忽略它们,因为 YAML 没有在 JSON 中别名化值的等价物,假装 有会产生看起来才正确的文档。

往返转换

将上面的示例从 YAML 转换回会返回完全相同的原始文档:"01234" 和 "true" 作为字符串,null 作为 null,以及完整的二十位整数。这个 往返是转换器的引号规则是否正确的真正测试,因为错误的规则通常 只有在你转回并比较时才会显现。

返回所有文章