让 YAML 变得像它看起来一样简单

开发 后端
YAML 看起来很简单,为什么它这么难写呢?了解成功使用 YAML 的两个秘诀。

[[427042]]

YAML 看起来很简单,为什么它这么难写呢?了解成功使用 YAML 的两个秘诀。

如果你曾经尝试过写 YAML,你可能一开始会对它看起来很容易感到高兴。乍一看,经常用于配置文件、Ansible 剧本和普通文件数据库的 YAML 看起来就像购物清单一样直观。然而,YAML 的结构中有很多细微的差别,它隐藏着一个危险的秘密:YAML 实际上是一种高度精确、结构化和令人惊讶的严格语言。好消息是,你只需要了解两件事就可以知道 YAML 的工作原理。

关于 YAML 的真相是,YAML 中只有两种数据结构:序列sequence映射mapping。这是两个花哨的名字,你会发现它代表了你非常熟悉的概念。这篇文章解释了这两种结构,更重要的是,介绍了它们是如何协同工作,使 YAML 成为表示你所关心的数据的强大方式。

YAML 序列

YAML 序列是一个列表。在其最简单的形式中,每行有一个项目,每行以破折号和空格开始。

下面是一个例子:

  1. ---
  2. - Linux
  3. - BSD
  4. - Illumos

不同的语言有不同的方式来表示这种数据。例如,在 Python 中,同一个列表可以写成 ['Linux', 'BSD', 'Illumos']。当你在现实生活中写一个列表时,例如在你去买菜之前,你写的可能近似于 YAML 序列。

YAML 映射

YAML 映射是一个关键术语与该术语的定义相结合。在其他语言中,映射被称为“键值对”或“词典”。

这里有一个例子:

  1. ---
  2. Kernel: Linux
  3. CPU: AMD
  4. RAM: '16 GB'

不同的语言有不同的方式来表示这种数据。在 Python 中,例如,同样的数据可以写成 {"Kernel": "Linux", "CPU": "AMD", "RAM": "16 GB"}。在现实生活中,你可能会使用这种结构来计划,例如,与朋友的游戏之夜。一个朋友报名带零食,另一个报名带一副牌,另一个报名带一个棋盘游戏,等等。

组合序列和映射

你现在知道 YAML 的语法了。序列和映射是 YAML 中仅有的两种构件,你想在 YAML 中表示的任何东西都可以放在序列或映射中。

或者同时使用这二者!

是的,序列和映射可以被组合和嵌套,这就是 YAML 看起来很直观,但同时又感觉很复杂的原因之一。不过,只有四种可能的组合,一旦你学会如何看它们,YAML 就会觉得像它看起来一样简单。

序列的映射

当你想让一个键项有许多值时,你可以使用一个序列的映射。也就是说,你从一个映射(键)开始,但是给值一个列表:

  1. ---
  2. Linux:
  3.   - Fedora
  4.   - Slackware
  5. BSD:
  6.  - FreeBSD
  7.   - NetBSD

在这个示例代码中,Linux 是第一个键,它的值是一个序列,其中包含 Fedora 和 Slackware。第二个键是 BSD,它的值是一个序列,包含 FreeBSD 和 NetBSD

映射的映射

当你想让一个键项的值中既有键又有值时,你可以使用映射的映射。也就是说,你从一个映射(键)开始,但是给值另一个映射。

这可能有点欺骗性,但它揭示了 YAML 中使用特定术语的原因:因为你只不过是创建了一个映射的列表,并不意味着你创建了一个序列。这里是一个映射的映射:

  1. ---
  2. Desktop:
  3.   CPU: RISC-V
  4.   RAM: '32 GB'
  5. Laptop:
  6.   CPU: AMD
  7.   RAM: '16 GB'

对大多数人来说,这看起来像一个列表。而且从技术上讲,它是一个列表。但重要的是要认识到,它不是 YAML 序列。它是一个映射,其中包含映射。作为半个 YAML 专家,你可以从明显缺少破折号的地方看出区别。

在 Ansible 剧本的所有结构中,我发现这个结构最容易欺骗人。作为人类,我们喜欢列表,当我们看到一个数据结构 在字面上 是列表时,大多数人会把它当成 YAML 序列。但是在 YAML 中,虽然序列是列表,但是列表并不总是序列。

序列的序列

就像你可以嵌套映射一样,你可以将一个序列嵌套到一个序列中:

  1. ---
  2. - [Linux, FreeBSD, Illumos]
  3. - [YAML, XML, JSON]

这可能是我在 YAML 的实际使用中遇到的最不常见的数据结构,但有时你需要一个列表的列表。

映射的序列

你也可以创建一个包含映射的序列。对于人类排序数据的方式来说,这并不太常见,但对于计算机来说,这可能是一个重要的结构。

这里有一个例子:

  1. ---
  2. -
  3.   CPU: AMD
  4.   RAM: '16 GB'
  5. -
  6.   CPU: Intel
  7.   RAM: '16 GB'

对于 YAML,这可能是最不直观的语法。我发现它在 Python 中呈现时更清晰:

  1. [{"CPU": "AMD", "RAM": "16 GB"}, {"CPU": "Intel", "RAM": "16 GB"}]

方括号代表一个列表结构,这个列表包含两个字典。每个字典都包含键值对。

构建更好的 YAML

现在你知道了 YAML 的两个组成部分,以及它们如何被组合起来以表示复杂的数据结构。问题是:你要用 YAML 构建什么?

和很多人一样,我也使用 YAML 来编写 Ansible 剧本。我还用它作为一种简单的配置格式、作为 D&D 的角色表、表示项目组织所需的目录结构,等等。只要你能适应序列和映射的概念,你会发现 YAML 是一种很容易编写、阅读和(如果有合适的库)解析的格式。

如果你发现自己经常使用 YAML,请下载我们的 YAML 速查表,以帮助你直观地了解基本数据结构及其组合,并帮助你记住一些额外的语法约定。通过一点点的练习,你会发现 YAML 真的和它看起来一样简单! 

 

责任编辑:庞桂玉 来源: Linux中国
相关推荐

2022-02-28 12:57:09

GNOMEPlasma桌面

2022-02-21 12:05:49

LibreOffiLinux工具栏

2022-05-26 01:15:22

GitHub代码快捷键

2022-03-30 14:23:48

LibreOfficOffice开源

2019-08-08 16:12:33

2020-06-29 15:00:31

UbuntumacOSLinux

2021-08-27 07:47:06

gecode

2022-09-26 12:53:54

JavaScrip单行代码

2009-12-08 14:26:13

大型网络运维

2012-10-26 12:33:58

视频会议视频通信华为

2021-12-19 22:48:53

JavaScript开发代码

2023-07-11 15:43:16

JavaScript技巧

2016-08-01 11:33:40

云迁移云安全合规性

2013-12-30 10:06:51

智能硬件3D打印互联网化

2015-11-06 16:20:36

107

2015-11-09 10:07:11

107

2017-05-22 10:33:14

PythonJuliaCython

2012-11-27 12:31:11

BYOD锐捷网络

2022-06-21 14:30:16

Vim自定义Linux

2023-06-26 08:01:42

debugger技巧代码
点赞
收藏

51CTO技术栈公众号