简介
- YAML 基础知识
yaml是什么
YAML(YAML Ain’t Markup Language的递归缩写)是一种人类可读的数据序列化格式。它常用于配置文件和数据交换格式,特别适用于各种编程语言之间的数据传递。
YAML的设计目标之一是提供一种易读且简洁的表示方法,以区别于其他常见的数据交换格式,如JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)。相对于其他格式,YAML更注重人类可读性,其语法结构主要基于缩进和简洁的标记。
以下是一个简单的YAML示例,表示一个包含一些信息的简单结构:
1 | name: John Doe |
在上面的例子中,每一行都是一个键值对,用冒号分隔。缩进表示层次结构,例如name
、age
和city
是顶级键,而is_student
是其中一个嵌套的键。与其他格式相比,YAML更加人类可读,因为它不需要额外的符号和标记。
YAML广泛用于各种场景,包括配置文件、CI/CD流水线配置、数据序列化等。
YAML 详解
YAML(YAML Ain’t Markup Language)是一种用于表示数据序列化的格式,其设计目标是提供一个易读且简洁的文本表达方式。下面是一些关于YAML的详细解释:
基本语法:
- 键值对:使用冒号(
:
)将键和值分隔。1
key: value
- 列表:使用连字符(
-
)表示列表项,列表项可以包含简单的值或者嵌套的键值对。1
2
3- item1
- item2
- key: value - 嵌套结构:使用缩进表示层次结构。
1
2
3parent:
child1: value1
child2: value2
- 键值对:使用冒号(
数据类型:
- 字符串:可以使用单引号或双引号括起来,也可以不使用引号。
1
2
3string1: 'single quoted'
string2: "double quoted"
string3: unquoted - 整数和浮点数:直接表示数字。
1
2integer: 42
float: 3.14 - 布尔值:可以使用
true
或false
表示。1
boolean: true
- 字符串:可以使用单引号或双引号括起来,也可以不使用引号。
注释:以井号(
#
)开头表示注释。1
2# This is a comment
key: value多行文本:使用竖线符号(
|
)表示多行文本块,保留换行符。1
2
3
4multiline: |
This is a
multiline
text block.折叠多行文本:使用右尖括号(
>
)表示折叠多行文本块,将换行符替换为空格。1
2
3
4folded: >
This is a folded
multiline
text block.引用:可以使用
&
创建锚点,使用*
引用锚点。1
2
3
4parent:
key: value
reference:特殊值:
null
表示空值。1
key: null
更多示例:
1
2
3
4
5
6
7
8
9
10
11
12
13user:
name: John Doe
age: 30
is_student: false
colors:
- red
- green
- blue
settings:
enable_feature: true
timeout: 5000
总体而言,YAML是一种灵活且易读的数据格式,广泛用于配置文件、数据交换和其他应用场景。在使用时,要注意缩进和空格的正确使用,因为它们在YAML中起着重要的语法作用。
yaml 基本语法 详解
YAML(YAML Ain’t Markup Language)的基本语法非常简洁和直观,以下是对其基本语法要点的详解:
键值对:
- 使用冒号(
:
)将键和值分隔。 - 键值对的格式为
key: value
。
1
2name: John Doe
age: 30- 使用冒号(
列表:
- 使用连字符(
-
)表示列表项。 - 列表项可以包含简单的值或者嵌套的键值对。
1
2
3
4fruits:
- apple
- banana
- orange- 使用连字符(
嵌套结构:
- 使用缩进表示层次结构,通常使用空格进行缩进。
- 缩进的空格数可以不同,但同一层次必须保持一致。
1
2
3
4
5
6person:
name: John Doe
age: 30
address:
city: New York
zip: '10001'字符串:
- 字符串可以使用单引号或双引号括起来,也可以不使用引号。
- 使用引号可以避免一些特殊字符引起的歧义。
1
2
3single_quoted: 'This is a single-quoted string.'
double_quoted: "This is a double-quoted string."
unquoted: This is an unquoted string.整数和浮点数:
- 直接表示数字,可以是整数或浮点数。
1
2integer: 42
float: 3.14布尔值:
- 使用
true
或false
表示布尔值。
1
is_student: false
- 使用
注释:
- 使用井号(
#
)表示注释,注释可以单独一行或在行尾添加。
1
2# This is a comment
key: value # Comment at the end of a line- 使用井号(
多行文本:
- 使用竖线符号(
|
)表示多行文本块,保留换行符。
1
2
3
4multiline: |
This is a
multiline
text block.- 使用竖线符号(
折叠多行文本:
- 使用右尖括号(
>
)表示折叠多行文本块,将换行符替换为空格。
1
2
3
4folded: >
This is a folded
multiline
text block.- 使用右尖括号(
引用:
- 可以使用
&
创建锚点,使用*
引用锚点。
1
2
3
4parent:
key: value
reference:- 可以使用
特殊值:
null
表示空值。
1
key: null
这些基本语法要点构成了YAML的基础,使其适用于多种场景,特别是作为配置文件或数据交换格式。在使用YAML时,注意缩进和空格的正确使用是非常重要的,因为它们直接影响文档的结构。
CPP中常用的YAML解析工具
除了YAML-cpp之外,还有一些其他常用的C++ YAML解析工具,这些工具提供了不同的功能和特性,可以根据项目需求选择合适的工具。以下是一些常见的C++ YAML解析工具:
YAML-cpp:YAML-cpp是一个流行的C++库,用于解析和生成YAML数据。它提供了简单易用的API,支持YAML 1.2规范,并且可以在多种平台上使用。上面提供的示例代码演示了如何使用YAML-cpp。
LibYAML:LibYAML是一个C库,但也有C++绑定可供使用。它是一个高性能的YAML解析器和生成器,支持YAML 1.2规范。虽然它在C++中需要使用C绑定,但它在处理大型YAML文件时性能出色。
YAML-cpp-Parser:这是一个建立在YAML-cpp之上的库,用于更方便地解析YAML数据。它提供了更简洁的API,可以帮助简化解析过程。
yaml-cpp03:这是YAML-cpp的一个旧版本,与C++03标准兼容。如果你的项目需要C++03支持,可以考虑使用此版本。
yaml-cpp11:这是YAML-cpp的C++11版本,支持现代C++标准。它在C++11及更高版本中使用时更适用。
**YAML++**:YAML++是另一个C++ YAML解析库,它提供了类型安全的API和更高级的功能,如自定义类型序列化和反序列化。
SimpleYAML:SimpleYAML是一个轻量级的C++库,用于处理YAML数据。它设计简单,易于学习和使用,适用于小型项目和快速原型开发。
Boost.PropertyTree:虽然Boost.PropertyTree不是专门用于YAML的库,但它支持多种数据格式,包括JSON和INI,可以用于解析YAML文件。这个库是Boost C++库集合的一部分。
根据项目的具体要求和C++标准的选择,你可以选择适合你需求的YAML解析工具。不同的工具在性能、易用性和功能方面可能有所不同,因此选择合适的工具非常重要。在使用任何库之前,建议查看其文档和示例以了解如何正确使用。
yaml数组
在 YAML (YAML Ain’t Markup Language) 中,数组(或列表)是一种用于表示多个值的结构。YAML 支持两种方式来定义数组:一是使用连字符(-
)作为前缀的列表,二是使用方括号([]
)包裹的逗号分隔值的方式。
1. 使用连字符的数组
这种方式在 YAML 中是最常见的,适合定义多行的列表。
1 | fruits: |
输出为:
1 | fruits: [Apple, Banana, Orange] |
2. 使用方括号的数组
这种方式适合单行定义数组。
1 | fruits: [Apple, Banana, Orange] |
这两种方式的功能是等效的。使用哪一种主要取决于格式的需求和个人的习惯。
YAML 数组中的每个元素是一个数组
在 YAML 中,如果数组的每个元素都是一个数组,可以通过多级缩进来表示。例如,使用 -
来表示数组的每一层,格式如下:
1 | matrix: |
在这个例子中:
matrix
是一个数组,其中的每个元素都是一个嵌套的数组。- 每个嵌套的数组在
matrix
下又包含多个元素。
你也可以将这些元素放在同一行来简化结构:
1 | matrix: |
这样也能表示一个二维数组,其中 matrix
是一个包含三个数组的数组,每个内部数组包含 3 个数字。这种格式特别适合表示矩阵或表格数据结构。
YAML 嵌套数组
在 YAML 中,嵌套数组可以通过缩进的方式来实现。具体语法如下:
- 普通数组:使用短横线
-
表示数组元素。 - 嵌套数组:在数组的某个元素下,再次使用短横线并进行适当缩进,来定义嵌套数组的层次结构。
以下是一个 YAML 嵌套数组的示例:
1 | fruits: |
在这个例子中:
fruits
是一个数组,包含 4 个元素。- 第三个元素
berries
和第四个元素citrus
是对象,这些对象的值是一个数组。
也可以用更深层次的嵌套数组:
1 | library: |
这里 library
是一个包含多个对象的数组,每个对象包含一个 books
数组。
这种 YAML 结构适用于表示复杂的树状数据。只要按照正确的缩进格式来写,就能顺利定义出嵌套数组。