它与 JSON 有什么不同? YAML 简介从
你好。
我是Mandai,负责Wild 开发团队。
JSON 数据格式流行已经有一段时间了,但还有一种类似的数据格式,称为 YAML。
我认为这取决于你通常使用的编程语言,你经常使用 JSON 还是 YAML。
开发API时,大部分与外界的通信都是用JSON,而如果你主要是用PHP做前端开发或者后端的话,很可能会用JSON来通信,JSON可以一次性转换使用内置函数。不过,接触YAML的机会也确实很少。
这次我总结一下YAML,了解了就很容易理解了。
关于 YAML
我确信您熟悉类似于术语 YAML 的内容。
HTML 非常相似,我认为 XML 也很相似。
当然,YAML 的正式名称是“YAML Ain't a Markup Language”,这是一个所谓的反义词。
因此,您对它是一种数据格式而不是标记语言的理解是正确的。
[基础知识] 支持的数据类型
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" } }
此外,还有一种映射类型(Ordered Mapping)可以与前面提到的序列类型结合起来指定排序顺序。
- aaa:测试1 - ccc:测试2 - bbb:测试3
如果键的顺序很重要,您可以结合使用指定顺序(如序列)和添加键(如映射)的组合。
JSON 中没有这个概念。
标量类型
最后一个是标量。
标量仅指单个值,例如数字、字符串或布尔值。
已经出现在map类型和sequence类型中了,但是什么样的值才是标量呢?除了map和sequence之外的所有数据类型都被认为是标量类型。
映射类型和序列类型表示结构而不是数据类型,因此可以说标量类型定义实际值。
由于标量类型不能单独编写,因此我们将尝试将其表示为序列类型的元素。
- 100 # 数字(十进制) - 016 # 数字(八进制) - 0xAC # 数字(十六进制) - 3.14 # 数字(浮点) - 12.3e+4 # 数字(指数) - .inf # 数字(+方向无穷大) - - .inf # 数字(- 方向无穷大) - true # bool - false # bool - on # bool - off # bool - yes # bool - no # bool - null # null - ~ # null - test # string - 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 范围内指定要在行首插入的空格数。
关于巢
正如我们已经多次看到的,映射和序列允许元素嵌套,因此可以使用缩进来表达嵌套。
在 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,您可以快速建立一个代码提示和验证工作的环境,因此我们强烈推荐它。
它是一个使用语言服务器的成熟扩展,并且易于使用。
它还支持外部架构,因此您可以加载预定义的架构,例如加载 API 开发中经常使用的 Swagger YAML 架构数据、AWS CloudFormation 的架构数据以及 docker-compose.yml 的架构数据。使用起来更方便。
包含 Kubernetes 的 YAML 架构,因此您无需准备它。
概括
这次,我写了一篇关于YAML的介绍性文章,其中包括一些小故事,但是你觉得怎么样?
YAML 很难!我认为有些人一直在回避它,因为他们不知道实际上只有三种基本数据类型。
标量类型有几种内置数据类型,虽然它们看起来都像字符串,但您可能已经了解到 YAML 清楚地区分了每种数据类型。
关于字符串,有几种方便的方法来表达多行字符串,因此最好看示例并使用当时适合您的表达方式。
如果你能自由地使用映射、序列或组合它们的有序映射(我想要一个好名字)来表达数据结构,并且能够以清晰的视图定义数据,那么代码肯定会更容易维护。
实际上,我无法向您介绍高级的使用方法,例如如何在不同的位置编写锚点和别名等数据定义,以及如何在一个文件中编写多个数据结构,我们打算另找机会介绍。就交给你了,敬请期待!
就是这样。