认知始于 Markdown 文件,不知道终于哪儿。

定义

YAML Ain’t a Markup Language / Yet Another Markup Language

文件后缀:.yml.yaml

注释:井号 或 哈希符号 #

结构:映射或列表,遵循层次结构,具体取决于缩进以及定义键值的方式。

语法:

  • 大小写敏感;
  • 使用缩进表示层级关系;
  • 缩进时不允许使用 Tab 键,只允许使用空格;
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;

应用

配置文件 configuration files -

YAML / JSON

相比 JSON,因为 YAML 有更好的可读性,对用户更友好,所以通常建议用 YAML 来编写配置文件,尽管它们在大多数情况下可以互换使用。

数据类型

  • 对象 mapping/hash/dictionary:键值对的集合;
  • 数组 sequence/list:一组按次序排列的值;数组和对象可以构成复合结构;
  • 纯量:最基本的,不可再分的值;

对象

对象的一组键值对,使用冒号结构表示。

animal: pets

转为 JavaScript 如下:

{ animal: 'pets' }

Yaml 也允许另一种写法,将所有键值对写成一个行内对象。

hash: { name: Steve, foo: bar }

转为 JavaScript 如下:

{ hash: { name: 'Steve', foo: 'bar' } }

数组

一组连词线开头的行,构成一个数组。

- Cat
- Dog
- Goldfish

转为 JavaScript 如下:

[ 'Cat', 'Dog', 'Goldfish' ]

纯量

纯量是最基本的、不可再分的值。

以下数据类型都属于 JavaScript 的纯量:

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • null:用 ~ 表示
  • 时间
  • 日期

复合结构

对象和数组可以结合使用,形成复合结构。

示例

选自 Red Hat 的学生信息例子:

#Comment: Student record
#Describes some characteristics and preferences
---
name: Martin D'vloper #key-value
age: 26
hobbies:
  - painting #first list item
  - playing_music #second list item
  - cooking #third list item
programming_languages:
  java: Intermediate
  python: Advanced
  javascript: Beginner
favorite_food:
  - vegetables: tomatoes
  - fruits:
      citrics: oranges
      tropical: bananas
      nuts: peanuts
      sweets: raisins

使用 Python 的 PyYAML 库,可转化为:

[
    {
        "name": "Martin D'vloper",
        "age": 26,
        "hobbies": ["painting", "playing_music", "cooking"],
        "programming_languages": {
            "java": "Intermediate",
            "python": "Advanced",
            "javascript": "Beginner",
        },
        "favorite_food": [
            {"vegetables": "tomatoes"},
            {
                "fruits": {
                    "citrics": "oranges",
                    "tropical": "bananas",
                    "nuts": "peanuts",
                    "sweets": "raisins",
                }
            },
        ],
    }
]

相关阅读