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

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

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 Yankees
national:
 - 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> 类型。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等。

相关文章
|
6月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
1448 1
|
7月前
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
445 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
6月前
|
编解码 监控 网络协议
RTSP协议规范与SmartMediaKit播放器技术解析
RTSP协议是实时流媒体传输的重要规范,大牛直播SDK的rtsp播放器基于此构建,具备跨平台支持、超低延迟(100-300ms)、多实例播放、高效资源利用、音视频同步等优势。它广泛应用于安防监控、远程教学等领域,提供实时录像、快照等功能,优化网络传输与解码效率,并通过事件回调机制保障稳定性。作为高性能解决方案,它推动了实时流媒体技术的发展。
317 5
|
6月前
|
Web App开发 移动开发 前端开发
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生&lt;audio&gt;标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
214 12
|
7月前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
6月前
|
Java 关系型数据库 数据库连接
Javaweb之Mybatis入门程序的详细解析
本文详细介绍了一个MyBatis入门程序的创建过程,从环境准备、Maven项目创建、MyBatis配置、实体类和Mapper接口的定义,到工具类和测试类的编写。通过这个示例,读者可以了解MyBatis的基本使用方法,并在实际项目中应用这些知识。
150 11
|
7月前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
6月前
|
设计模式 SQL Java
【再谈设计模式】解释器模式~语法的解析执行者
解释器模式定义了一种语言的语法表示,并定义一个解释器来解释该语言中的句子。它使用类来表示每个语法规则,并且通过递归调用这些类的方法来解释表达式。本质上,它将一个复杂的表达式分解为一系列简单的部分,然后按照特定的语法规则进行解析和执行。
123 8
|
6月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
8月前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
1220 12

推荐镜像

更多
  • DNS