写点什么

【YAML 语法规范指南】从入门到精通,揭秘神秘语法,引领配置文件解析指南(基础结构篇)

作者:洛神灬殇
  • 2024-02-05
    江苏
  • 本文字数:2271 字

    阅读完需:约 7 分钟

【YAML语法规范指南】从入门到精通,揭秘神秘语法,引领配置文件解析指南(基础结构篇)

YAML 是什么

"YAML Ain't Markup Language"(简称 YAML)是一种专为人类设计的数据序列化语言,适用于多种现代编程语言,可广泛应用于各类日常任务。它是一种以人类可读形式呈现的、适用于多种语言的 Unicode 数据序列化标准。它基于敏捷编程中常见的本地数据结构,广泛应用于配置文件、互联网消息传递、对象持久化以及数据审计等多个领域。遵循 Unicode 标准、

YAML 设计目标

YAML 的设计目标包括简洁性、人类友好、数据序列化、可移植性、灵活性、高效性和跨平台性。它使用 Unicode 可打印字符,通过最小化结构字符数量,并允许数据以自然和有意义的方式显示,实现独特的简洁性。目标主要包括以下几点:


数据结构

有各种类型的数据结构,但它们都可以用三个基本原语来充分表示:映射(哈希/字典)、序列(数组/列表)和标量(字符串/数字)。


使用场景

虽然编程语言繁多,但用于存储和传输数据的语言却为数不多。尽管 YAML 的潜力巨大,但它的设计初衷是为了满足一些常见的应用场景。



如:配置文件、日志文件、进程间消息传递、跨语言数据共享、对象持久性以及复杂数据结构的展示。当数据变得易于查看和理解时,编程工作也会变得更加轻松。

模型案例

接下来,我们将简要了解 YAML 的表达能力。不必强求每位初次读者都通读所有示例,相反,这些精选示例旨在为规范的后续部分提供启发和参考。


注意,YAML 对缩进非常敏感,通常使用空格进行缩进,并且要求同一层级的元素具有相同的缩进量。在编写 YAML 文件时,确保正确的缩进是非常重要的。

模型基本结构

YAML 语法的集合结构主要包括块集合和流序列两种形式。


  • 块集合通过缩进来定义元素,每个元素占据一行,且元素前面带有破折号和空格。这种结构主要用于表示键值对,其中键和值之间使用冒号和空格分隔。

  • 流序列则使用逗号分隔的列表形式表示,可以包含任意数量的元素,每个元素占据一行。这种结构主要用于表示列表、数组等线性数据结构。

列表结构

对应的 Java 中 Collection

块序列

使用破折号和空格表示每个条目,每个条目占据一行。例如:


fruits:  - apple  - banana  - orange
复制代码

流序列

使用逗号分隔的列表形式表示,每个元素占据一行。例如:


fruits: [apple, banana,orange]
复制代码

数组结构

对应的 Java 中 Array

块序列

每个元素前面都带有一个破折号(-),并且每个元素都从新的一行开始,通过缩进来表示它们属于同一个集合或列表。


fruits:  - apple  - banana  - orange
复制代码

流序列

使用方括号表示,元素之间使用空格分隔。例如:


fruits: [apple, banana,orange]
复制代码

哈希结构

在 YAML 中,可以使用键值对的形式来表示 Map(映射)。每个键值对由键和值组成,键和值之间使用冒号(:)分隔,并且通常将每个键值对放在不同的行上以增加可读性。以下是一个示例:


对应的 Java 中 Map


myMap:  key1: value1  key2: value2  key3: value3
复制代码


在这个例子中,myMap是映射的名称,而key1key2key3是键,对应的value1value2value3是值。请注意,在实际使用中,应根据具体的需求来替换键和值。


另外,YAML 还支持使用花括号({})来表示映射,特别是在行内表示时。例如:


myMap: {key1: value1, key2: value2, key3: value3}
复制代码


然而,使用花括号的形式在 YAML 中并不常见,因为它可能会与其他数据格式(如 JSON)混淆。通常推荐使用换行和缩进的形式来表示映射,以保持 YAML 的可读性和清晰度。

哈希-列表结构

Java中的 Map<String, List<String>> 类型

块序列

american: - Boston Red Sox - Detroit Tigers - New York Yankeesnational: - New York Mets - Chicago Cubs - Atlanta Braves
复制代码

流序列

{american: [Boston Red Sox,Detroit Tigers,New York Yankees], national: [New York Mets,Chicago Cubs,Atlanta Braves]}
复制代码


这种数据结构可以对应到 Java 中的 Map<String, List<String>> 类型。american 和 national 是 Map 的键(Key);每个键后面跟着的短横线 - 开头的结构表明这是一个列表(List),代表 Map 的值(Value)。例如,用 Java 代码表示就是:

代码实现

Map<String, List<String>> baseballTeams = new HashMap<>();baseballTeams.put("american", Arrays.asList("Boston Red Sox", "Detroit Tigers", "New York Yankees"));baseballTeams.put("national", Arrays.asList("New York Mets", "Chicago Cubs", "Atlanta Braves"));
复制代码


此 YAML 结构中的每个列表项都可能代表一个具体的棒球队。americannational 可能分别代表美国棒球大联

列表-哈希结构

- name: Mark McGwire hr: 65 avg: 0.278- name: Sammy Sosa hr: 63 avg: 0.288
复制代码


可以被看做是一个对象的数组或者在 Java 中的 List<Map<String, Object>> 类型。例如,我们使用 Java 代码将其表示如下:


List<Map<String, Object>> players = new ArrayList<>();Map<String, Object> player1 = new HashMap<>();player1.put("name", "Mark McGwire");player1.put("hr", 65);player1.put("avg", 0.278);players.add(player1);... ...
复制代码

流序列

[{name: Mark McGwire,hr: 65,avg: 0.278},{name: Sammy Sosa,hr: 63,avg: 0.288}]
复制代码

列表-列表结构

混合结构

- [name , hr, avg ]- [Mark McGwire, 65, 0.278]- [Sammy Sosa , 63, 0.288]
复制代码

哈希-哈希结构

混合结构

Mark McGwire: {hr: 65, avg: 0.278}Sammy Sosa: { hr: 63, avg: 0.288 }
复制代码

最后总结

YAML 利用这些原语,并添加了一个简单的类型系统和别叠机制,以形成一种用于序列化任何数据结构的完整语言。虽然大多数编程语言都可以使用 YAML 来进行数据序列化,但 YAML 擅长于那些从基本意义上讲是围绕这三个基本原语构建的语言。这些语言包括新一波的敏捷语言,如:Java、Perl、Python、PHP、Ruby 和 Javascript 等。

发布于: 刚刚阅读数: 4
用户头像

洛神灬殇

关注

🏆 InfoQ写作平台-签约作者 🏆 2020-03-25 加入

👑 后端技术架构师,前优酷资深工程师 📕 个人著作《深入浅出Java虚拟机—JVM原理与实战》 💻 10年开发经验,参与过多个大型互联网项目,定期分享技术干货和项目经验

评论

发布
暂无评论
【YAML语法规范指南】从入门到精通,揭秘神秘语法,引领配置文件解析指南(基础结构篇)_配置_洛神灬殇_InfoQ写作社区