如果您曾经尝试编写 YAML,您最初可能会对其看起来如此简单感到满意。乍一看,YAML 通常用于配置文件、Ansible 剧本和平面文件数据库,看起来或多或少像购物清单一样直观。 然而,YAML 的结构有很多细微之处,它隐藏着一个危险的秘密:YAML 实际上是一种高度精确、结构化且出人意料地严格的语言。 好消息是,您只需要理解两件事就可以了解 YAML 的工作原理。
关于 YAML 的真相是,YAML 中只有两种数据结构:序列和映射。 这是两个花哨的名称,代表您将发现的非常熟悉的概念。 本文解释了它们两者,更重要的是,它们如何协同工作以使 YAML 成为表示您所关心的数据的强大方式。
什么是 YAML 序列?
YAML 序列是一个列表。 以最简单的形式,每行一项,每行以破折号和空格开头。
这是一个例子
---
- Linux
- BSD
- Illumos
不同的语言有不同的方式来表示这种数据。 例如,在 Python 中,同一个列表可以写成 ['Linux', 'BSD', 'Illumos']
。 当你在现实生活中写一个列表时,例如在你去购物之前,你可能会近似一个 YAML 序列。
什么是 YAML 映射?
YAML 映射是一个键术语与该术语的定义相结合。 在其他语言中,映射称为键值对或字典。
这是一个例子
---
Kernel: Linux
CPU: AMD
RAM: '16 GB'
不同的语言有不同的方式来表示这种数据。 例如,在 Python 中,相同的数据可以写成 {"Kernel": "Linux", "CPU": "AMD", "RAM": "16 GB"}
。 在现实生活中,您可以使用这种结构来计划,例如,与朋友一起进行游戏之夜。 一个朋友报名带零食,另一个朋友报名带一副扑克牌,另一个朋友报名带棋盘游戏等等。
组合序列和映射
现在您知道了 YAML 的语法。 序列和映射是 YAML 中仅有的两种构建块,您想要在 YAML 中表示的任何内容都可以放入序列或映射中。
或者两者都放!
是的,序列和映射可以组合和嵌套,这是 YAML 看起来直观但又感觉复杂的原因之一。 但是只有四种可能的组合,一旦你学会了识别它们,YAML 就会开始感觉像看起来一样容易。
映射序列
当您希望一个键术语具有多个值时,您可以使用序列的映射。 也就是说,您从映射(键)开始,但为值插入一个列表
---
Linux:
- Fedora
- Slackware
BSD:
- FreeBSD
- NetBSD
在此示例代码中,Linux 是第一个键,其值是一个序列,其中包含 Fedora 和 Slackware。 第二个键是 BSD,其值是一个包含 FreeBSD 和 NetBSD 的序列。
映射的映射
当您希望一个键术语具有本身也具有键和值的值时,您可以使用映射的映射。 也就是说,您从映射(键)开始,但为值插入另一个映射。
这一个具有欺骗性,但它揭示了为什么在 YAML 中使用特殊术语:仅仅因为您创建了一个映射列表并不意味着您创建了一个序列。 这是一个映射的映射
---
Desktop:
CPU: RISC-V
RAM: '32 GB'
Laptop:
CPU: AMD
RAM: '16 GB'
对大多数人来说,这看起来像一个列表。 从技术上讲,它确实是一个列表。 但重要的是要认识到它不是一个 YAML 序列。 它是一个映射,其中包含映射。 作为 YAML 方面的近专家,您可以从明显的缺少破折号中发现差异。
在 Ansible 剧本的所有结构中,我发现这个结构最容易让人上当。 作为人类,我们喜欢列表,当我们看到一个字面意义上的列表的数据结构时,大多数人都会被迫将其翻译成 YAML 序列。 但是在 YAML 中,虽然序列是一个列表,但列表并不总是序列。
序列的序列
正如您可以嵌套映射一样,您可以将序列嵌套到序列中
---
- [Linux, FreeBSD, Illumos]
- [YAML, XML, JSON]
这可能是我在 YAML 的实际使用中遇到的最不常见的数据结构,但有时您需要一个列表的列表。
映射的序列
您还可以创建一个包含映射的序列。 这对于人类对数据进行排序的方式来说不是很常见,但对于计算机来说,它可能是一个重要的结构。
这是一个例子
---
-
CPU: AMD
RAM: '16 GB'
-
CPU: Intel
RAM: '16 GB'
作为 YAML,这可能是最不直观的语法。 我发现用 Python 渲染时更清晰
[{"CPU": "AMD", "RAM": "16 GB"}, {"CPU": "Intel", "RAM": "16 GB"}]
方括号代表列表结构,该列表包含两个字典。 每个字典包含键值对。
构建更好的 YAML
现在您知道了 YAML 的两个组成部分,以及如何将它们组合起来以表示复杂的数据结构。 问题是:您将使用 YAML 构建什么?
我和很多人一样,使用 YAML 来编写 Ansible 剧本。 我还将其用作简单的配置格式、D&D 的角色表、项目组织所需的目录结构的表示等等。 只要您熟悉序列和映射的概念,您可能会发现 YAML 是一种易于编写、阅读和(如果提供了正确的库)解析的格式。
如果您发现自己经常使用 YAML,请下载我们的 YAML 速查表,以帮助您可视化基本数据结构及其组合,并帮助您记住一些可用的额外语法约定。 稍加练习,您会发现 YAML 真的像它看起来一样简单!
评论已关闭。