0%

Yaml

简介

  • YAML 基础知识

yaml是什么

YAML(YAML Ain’t Markup Language的递归缩写)是一种人类可读的数据序列化格式。它常用于配置文件和数据交换格式,特别适用于各种编程语言之间的数据传递。

YAML的设计目标之一是提供一种易读且简洁的表示方法,以区别于其他常见的数据交换格式,如JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)。相对于其他格式,YAML更注重人类可读性,其语法结构主要基于缩进和简洁的标记。

以下是一个简单的YAML示例,表示一个包含一些信息的简单结构:

1
2
3
4
name: John Doe
age: 30
city: New York
is_student: false

在上面的例子中,每一行都是一个键值对,用冒号分隔。缩进表示层次结构,例如nameagecity是顶级键,而is_student是其中一个嵌套的键。与其他格式相比,YAML更加人类可读,因为它不需要额外的符号和标记。

YAML广泛用于各种场景,包括配置文件、CI/CD流水线配置、数据序列化等。

YAML 详解

YAML(YAML Ain’t Markup Language)是一种用于表示数据序列化的格式,其设计目标是提供一个易读且简洁的文本表达方式。下面是一些关于YAML的详细解释:

  1. 基本语法

    • 键值对:使用冒号(:)将键和值分隔。
      1
      key: value
    • 列表:使用连字符(-)表示列表项,列表项可以包含简单的值或者嵌套的键值对。
      1
      2
      3
      - item1
      - item2
      - key: value
    • 嵌套结构:使用缩进表示层次结构。
      1
      2
      3
      parent:
      child1: value1
      child2: value2
  2. 数据类型

    • 字符串:可以使用单引号或双引号括起来,也可以不使用引号。
      1
      2
      3
      string1: 'single quoted'
      string2: "double quoted"
      string3: unquoted
    • 整数和浮点数:直接表示数字。
      1
      2
      integer: 42
      float: 3.14
    • 布尔值:可以使用 truefalse 表示。
      1
      boolean: true
  3. 注释:以井号(#)开头表示注释。

    1
    2
    # This is a comment
    key: value
  4. 多行文本:使用竖线符号(|)表示多行文本块,保留换行符。

    1
    2
    3
    4
    multiline: |
    This is a
    multiline
    text block.
  5. 折叠多行文本:使用右尖括号(>)表示折叠多行文本块,将换行符替换为空格。

    1
    2
    3
    4
    folded: >
    This is a folded
    multiline
    text block.
  6. 引用:可以使用 & 创建锚点,使用 * 引用锚点。

    1
    2
    3
    4
    parent: &anchor
    key: value

    reference: *anchor
  7. 特殊值

    • null 表示空值。
      1
      key: null
  8. 更多示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    user:
    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)的基本语法非常简洁和直观,以下是对其基本语法要点的详解:

  1. 键值对

    • 使用冒号(:)将键和值分隔。
    • 键值对的格式为 key: value
    1
    2
    name: John Doe
    age: 30
  2. 列表

    • 使用连字符(-)表示列表项。
    • 列表项可以包含简单的值或者嵌套的键值对。
    1
    2
    3
    4
    fruits:
    - apple
    - banana
    - orange
  3. 嵌套结构

    • 使用缩进表示层次结构,通常使用空格进行缩进。
    • 缩进的空格数可以不同,但同一层次必须保持一致。
    1
    2
    3
    4
    5
    6
    person:
    name: John Doe
    age: 30
    address:
    city: New York
    zip: '10001'
  4. 字符串

    • 字符串可以使用单引号或双引号括起来,也可以不使用引号。
    • 使用引号可以避免一些特殊字符引起的歧义。
    1
    2
    3
    single_quoted: 'This is a single-quoted string.'
    double_quoted: "This is a double-quoted string."
    unquoted: This is an unquoted string.
  5. 整数和浮点数

    • 直接表示数字,可以是整数或浮点数。
    1
    2
    integer: 42
    float: 3.14
  6. 布尔值

    • 使用 truefalse 表示布尔值。
    1
    is_student: false
  7. 注释

    • 使用井号(#)表示注释,注释可以单独一行或在行尾添加。
    1
    2
    # This is a comment
    key: value # Comment at the end of a line
  8. 多行文本

    • 使用竖线符号(|)表示多行文本块,保留换行符。
    1
    2
    3
    4
    multiline: |
    This is a
    multiline
    text block.
  9. 折叠多行文本

    • 使用右尖括号(>)表示折叠多行文本块,将换行符替换为空格。
    1
    2
    3
    4
    folded: >
    This is a folded
    multiline
    text block.
  10. 引用

    • 可以使用 & 创建锚点,使用 * 引用锚点。
    1
    2
    3
    4
    parent: &anchor
    key: value

    reference: *anchor
  11. 特殊值

    • null 表示空值。
    1
    key: null

这些基本语法要点构成了YAML的基础,使其适用于多种场景,特别是作为配置文件或数据交换格式。在使用YAML时,注意缩进和空格的正确使用是非常重要的,因为它们直接影响文档的结构。

CPP中常用的YAML解析工具

除了YAML-cpp之外,还有一些其他常用的C++ YAML解析工具,这些工具提供了不同的功能和特性,可以根据项目需求选择合适的工具。以下是一些常见的C++ YAML解析工具:

  1. YAML-cpp:YAML-cpp是一个流行的C++库,用于解析和生成YAML数据。它提供了简单易用的API,支持YAML 1.2规范,并且可以在多种平台上使用。上面提供的示例代码演示了如何使用YAML-cpp。

  2. LibYAML:LibYAML是一个C库,但也有C++绑定可供使用。它是一个高性能的YAML解析器和生成器,支持YAML 1.2规范。虽然它在C++中需要使用C绑定,但它在处理大型YAML文件时性能出色。

  3. YAML-cpp-Parser:这是一个建立在YAML-cpp之上的库,用于更方便地解析YAML数据。它提供了更简洁的API,可以帮助简化解析过程。

  4. yaml-cpp03:这是YAML-cpp的一个旧版本,与C++03标准兼容。如果你的项目需要C++03支持,可以考虑使用此版本。

  5. yaml-cpp11:这是YAML-cpp的C++11版本,支持现代C++标准。它在C++11及更高版本中使用时更适用。

  6. **YAML++**:YAML++是另一个C++ YAML解析库,它提供了类型安全的API和更高级的功能,如自定义类型序列化和反序列化。

  7. SimpleYAML:SimpleYAML是一个轻量级的C++库,用于处理YAML数据。它设计简单,易于学习和使用,适用于小型项目和快速原型开发。

  8. Boost.PropertyTree:虽然Boost.PropertyTree不是专门用于YAML的库,但它支持多种数据格式,包括JSON和INI,可以用于解析YAML文件。这个库是Boost C++库集合的一部分。

根据项目的具体要求和C++标准的选择,你可以选择适合你需求的YAML解析工具。不同的工具在性能、易用性和功能方面可能有所不同,因此选择合适的工具非常重要。在使用任何库之前,建议查看其文档和示例以了解如何正确使用。

yaml数组

在 YAML (YAML Ain’t Markup Language) 中,数组(或列表)是一种用于表示多个值的结构。YAML 支持两种方式来定义数组:一是使用连字符(-)作为前缀的列表,二是使用方括号([])包裹的逗号分隔值的方式。

1. 使用连字符的数组

这种方式在 YAML 中是最常见的,适合定义多行的列表。

1
2
3
4
fruits:
- Apple
- Banana
- Orange

输出为:

1
fruits: [Apple, Banana, Orange]

2. 使用方括号的数组

这种方式适合单行定义数组。

1
fruits: [Apple, Banana, Orange]

这两种方式的功能是等效的。使用哪一种主要取决于格式的需求和个人的习惯。

YAML 数组中的每个元素是一个数组

在 YAML 中,如果数组的每个元素都是一个数组,可以通过多级缩进来表示。例如,使用 - 来表示数组的每一层,格式如下:

1
2
3
4
5
6
7
8
9
10
matrix:
- - 1
- 2
- 3
- - 4
- 5
- 6
- - 7
- 8
- 9

在这个例子中:

  • matrix 是一个数组,其中的每个元素都是一个嵌套的数组。
  • 每个嵌套的数组在 matrix 下又包含多个元素。

你也可以将这些元素放在同一行来简化结构:

1
2
3
4
matrix:
- [1, 2, 3]
- [4, 5, 6]
- [7, 8, 9]

这样也能表示一个二维数组,其中 matrix 是一个包含三个数组的数组,每个内部数组包含 3 个数字。这种格式特别适合表示矩阵或表格数据结构。

YAML 嵌套数组

在 YAML 中,嵌套数组可以通过缩进的方式来实现。具体语法如下:

  1. 普通数组:使用短横线 - 表示数组元素。
  2. 嵌套数组:在数组的某个元素下,再次使用短横线并进行适当缩进,来定义嵌套数组的层次结构。

以下是一个 YAML 嵌套数组的示例:

1
2
3
4
5
6
7
8
9
10
11
fruits:
- apple
- banana
- berries:
- strawberry
- blueberry
- raspberry
- citrus:
- orange
- lemon
- lime

在这个例子中:

  • fruits 是一个数组,包含 4 个元素。
  • 第三个元素 berries 和第四个元素 citrus 是对象,这些对象的值是一个数组。

也可以用更深层次的嵌套数组:

1
2
3
4
5
6
7
8
9
library:
- name: Fiction
books:
- title: "The Great Gatsby"
- title: "To Kill a Mockingbird"
- name: Science
books:
- title: "A Brief History of Time"
- title: "The Selfish Gene"

这里 library 是一个包含多个对象的数组,每个对象包含一个 books 数组。

这种 YAML 结构适用于表示复杂的树状数据。只要按照正确的缩进格式来写,就能顺利定义出嵌套数组。

感谢老板支持!敬礼(^^ゞ