[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

它与 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 清楚地区分了每种数据类型。
关于字符串,有几种方便的方法来表达多行字符串,因此最好看示例并使用当时适合您的表达方式。

如果你能自由地使用映射、序列或组合它们的有序映射(我想要一个好名字)来表达数据结构,并且能够以清晰的视图定义数据,那么代码肯定会更容易维护。

实际上,我无法向您介绍高级的使用方法,例如如何在不同的位置编写锚点和别名等数据定义,以及如何在一个文件中编写多个数据结构,我们打算另找机会介绍。就交给你了,敬请期待!

就是这样。

如果您觉得这篇文章有帮助,请点赞!
2
加载中...
2 票,平均:1.00 / 12
34,298
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

写这篇文章的人

关于作者

万代洋一

我的主要工作是为社交游戏开发 Web API,但我也很幸运能够做很多其他工作,包括营销。
此外,我在 Beyond 中的肖像权被视为 CC0。