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

大家好,
我是Mandai,Wild团队负责开发工作的成员。
虽然 JSON 数据格式已经广泛应用多年,但还有一种类似的格式叫做 YAML。
你更常用 JSON 还是 YAML,取决于你常用的编程语言。
在开发 API 时,与外部的通信大多采用 JSON 格式;即使在前端或后端开发中,如果你主要使用 PHP,也大多会使用 JSON 进行通信,因为 JSON 可以通过内置函数一次性转换为 YAML,所以你很少有机会使用 YAML。
这次,我将总结一下 YAML,一旦你了解了它,就很容易理解了。
关于 YAML
我相信大家都很熟悉类似 YAML 的术语。HTML
和 XML 也非常相似。
,其含义是“TYAML 不是一种标记语言一个反向首字母缩写词”。
所以,我之前关于它是一种数据格式而不是标记语言的理解是正确的。
【基础知识】可处理的数据类型
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 的扩展程序
这是一个功能齐全的扩展程序,使用语言服务器,而且非常易于使用。它还
支持外部模式,因此您可以加载预定义的模式,例如 Swagger YAML 模式数据(常用于 API 开发)、AWS CloudFormation 模式数据和 docker-compose.yml 模式数据,从而更加方便使用。
Kubernetes 的 YAML 模式已经包含在内,所以您无需自己准备。
概括
这次我写了一篇关于 YAML 的入门文章,其中包含一些有趣的事实。你觉得怎么样?
我想有些人觉得 YAML 很难,还有些人因为不知道它实际上只有三种基本数据类型而避而远之。
标量类型有几种内置数据类型,虽然它们看起来都像字符串,但您可能已经注意到 YAML 能够正确区分它们。关于
字符串,有几种便捷的方式来表示多行字符串,因此您需要参考示例,为每种情况选择合适的方法。
你可以使用映射、序列以及二者结合的有序映射(我需要一个更好的名称)来自由地表达数据结构,如果你能创建清晰的数据定义,你一定会得到易于维护的代码。
事实上,我们未能完全介绍一些高级使用技巧,例如如何在不同的位置编写数据定义(如锚点和别名),或者如何在单个文件中编写多个数据结构,因此我们计划在另一次活动中介绍它们,敬请期待!
就这样。
2
