本文将介绍 YAML,首先探讨它与 JSON 的区别?

大家好,
我是开发团队野生队的成员 Mandai。
JSON 数据格式已经存在很长时间了,但还有另一种类似的数据格式叫做 YAML。
你更常用 JSON 还是 YAML,取决于你通常使用的编程语言。
在开发 API 时,大多数与外部世界的通信都是使用 JSON 格式的。如果你主要使用 PHP 进行前端或后端开发,那么你很可能也会使用 JSON 进行通信,因为 JSON 可以通过内置函数一次性转换为 YAML 格式。因此,你确实很少有机会接触到 YAML。
这次,我将总结一下 YAML,一旦你了解了它,就很容易理解了。
关于 YAML
我相信大家都很熟悉 YAML
和 XML 这两个术语,它们与 HTML 类似。
一个反向首字母缩写词,意思是 YAML 不是一种标记语言。
所以,我之前关于它是一种数据格式而不是标记语言的理解是正确的。
【基础知识】可处理的数据类型
YAML 只能处理三种数据类型:
- 顺序
- 地图(制图)
- 标量
既然数据只能用这三种类型来表示,你不觉得很容易理解吗?
通过将它们与各种符号结合起来,就能表达更广泛的含义,从而可以表示各种类型的数据。
让我们仔细看看每种数据类型。
序列类型
序列是一种带有连续数字下标的数组。
它没有键的概念,因此仅用于存储多个值。
- abc - def - 123
以连字符开头,然后是一个空格,接着输入数据。
将上述 YAML 数据转换为 JSON 后,它将如下所示:
["abc", "def", 123]
地图类型
映射是一种可以指定下标的数组(关联数组)。
它包含一个键值对,值可以是标量、序列或映射,因此结构很容易变得复杂。
aaa:测试1 bbb:测试2 ccc:测试3 ddd:eee:测试4 fff:测试5
在上面的例子中,以 ddd 为键的值是一个映射,并且它是嵌套的。
转换成 JSON 格式后,它会变成以下格式。
{"abc": "test1", "bbb": "test2", "ccc": "test3", "ddd": {"eee": "test4", "fff": "test5"}}
如果我们将其格式化以便于查看,它将如下所示:
{ "abc": "test1", "bbb": "test2", "ccc": "test3", "ddd": { "eee": "test4", "fff": "test5" } }
此外,还有一种称为有序映射的类型,可以与上面提到的序列类型结合使用来指定顺序。
- aaa:测试1 - ccc:测试2 - bbb:测试3
如果键的顺序很重要,你可以将类似序列的排序方式与类似映射的键结合起来。JSON
中不存在这种概念。
标量类型
最后,还有标量。
简单来说,标量是单个值,例如数字、字符串和布尔值。
我们已经在映射和序列类型中看到了标量,那么究竟哪些值属于标量呢?除了映射和序列之外的所有数据类型都被视为标量类型。
Map 和 sequence 类型表示的是结构而不是数据类型,所以可以说,是标量类型定义了实际存在的值。
由于标量类型不能单独编写,我们将把它们表示为序列类型的元素。
- 100 # 数字(十进制) - 016 # 数字(八进制) - 0xAC # 数字(十六进制) - 3.14 # 数字(浮点数) - 12.3e+4 # 数字(指数) - .inf # 数字(正无穷) - -.inf # 数字(负无穷) - true # 布尔值 - false # 布尔值 - on # 布尔值 - off # 布尔值 - yes # 布尔值 - no # 布尔值 - null # null - ~ # null - test # 字符串 - 1980/09/02 # 字符串(备注) - 1980-09-02 00:00:00.000-09:00 # 日期时间(ISO-8601 格式) - 1980-09-02 # 日期(年、月、日) - 1980 # 日期(年)
其中,只有字符串可以包含多行数据(包括换行符),因此提供了几个魔法咒语来表示多行文本数据。
# 包含换行符的纯文本 test1: | 您可以输入包含换行符的文本。您可以输入包含换行符的文本。
# 将换行符替换为半角空格(提取数据时将不存在换行符代码) test2: > 您可以编写包含换行符的文本。您可以编写包含换行符的文本。
无论采用哪种格式,每行开头的半角缩进空格都会被移除。
如果是“">",,移除后,换行符会被替换成半角空格。
此外,通过将上述两个运算符与“+”和“-”组合起来,您可以定义是否包含或删除最后一行的换行符。
# 在最后一行末尾添加换行符 test3: |+ 您可以编写包含换行符的文本。您可以编写包含换行符的文本。
# 不要在最后一行末尾添加换行符代码 test4: |- 您可以编写包含换行符的文本。您可以编写包含换行符的文本。
# 在最后一行末尾添加换行符代码(但删除文本中的换行符) test3: >+ 您可以编写包含换行符的文本。您可以编写包含换行符的文本。
# 不要在最后一行末尾添加换行符 test4: >- 您可以编写包含换行符的文本。您可以编写包含换行符的文本。
根据文本内容,您可能不希望删除用于缩进的空格。
在这种情况下,您可以指定在每行开头插入多少个空格。
# 每行开头加两个空格 test1: |2 您可以输入包含换行符的文本。您可以输入包含换行符的文本。
# 每行开头加 4 个空格 test1: |4 您可以输入包含换行符的文本。您可以输入包含换行符的文本。
行首空格数与缩进数之间存在微妙的关系。如果缩进中的空格数超过指定数,则没问题;但如果空格数少于指定数,则格式似乎不正确。
# 错误,因为每行开头必须至少有四个空格 test1: |4 您可以输入包含换行符的文本。您可以输入包含换行符的文本。
此外,根据 YAML 定义,可以在 1 <= n <= 9 的范围内指定在行首插入的空格数。
关于Nest
我们之前已经多次看到,映射和序列允许你嵌套元素,而这种嵌套可以通过缩进来表示。
在 YAML 中,缩进的定义为每两个空格缩进一个空格。
# 嵌套序列 - aaa - bbb - ccc - ddd - eee - fff
# 嵌套映射 aaa: test1 bbb: test2 ccc: ddd: test3 eee: test4 fff: test5
# 嵌套序列和映射 - aaa - bbb - ccc ddd: test1 eee: test2 fff: test3
# 嵌套映射和序列 aaa: test1 bbb: test2 ccc: - ddd - eee - fff
# 嵌套有序映射(注意缩进数量) - aaa: test1 - ccc: test2 - bbb: - ddd - eee - fff
如果一个映射或序列是有序映射的子元素,那么除非缩进两个空格(四个空格),否则它似乎无法正确嵌套。
如果您在 Visual Studio Code 中使用 YAML:
在 Visual Studio Code(以下简称 VSCode)中使用 YAML 时,由于它提供了一些标准支持,因此使用起来很方便。
但是,我认为需要一些扩展程序来创建更便捷的使用环境。
我强烈推荐使用
Red Hat 发布的YAML这款功能齐全的扩展使用 Language Server,而且易于使用。它还
支持外部模式,因此您可以加载预定义的模式,例如常用于 API 开发的 Swagger YAML 模式数据、AWS CloudFormation 模式数据以及 docker-compose.yml 模式数据,从而进一步简化了使用过程。
Kubernetes 的 YAML 模式已经包含在内,所以您无需自己准备。
概括
这次我写了一篇关于 YAML 的入门文章,还分享了一些小技巧。你们觉得怎么样?
我确信有些人觉得 YAML 很难,有些人甚至因为不知道它其实只有三种基本数据类型而避而远之。
YAML 内置了多种标量数据类型,虽然它们看起来都像是字符串,但实际上 YAML 能够正确区分每种数据类型。对于
字符串,YAML 提供了多种便捷的方式来表示多行字符串,因此最好参考示例并选择最适合你的表达式。
你可以使用映射、序列以及二者结合的有序映射(我需要一个更好的名称)来自由地表达数据结构,如果你能创建清晰的数据定义,你一定会得到易于维护的代码。
事实上,我们未能完全介绍一些高级使用技巧,例如如何在不同的位置编写数据定义(如锚点和别名),或者如何在单个文件中编写多个数据结构,因此我们计划在另一次活动中介绍它们,敬请期待!
就这样。
2