Шпаргалка по YAML

YAML (YAML Ain’t Markup Language, YAML не является языком разметки) – это язык сериализации данных. Используется множеством различных инструментов, например Kubernetes, Docker Compose и Ansible Playbooks. Также используется по умолчанию в PHP фреймворке Symfony для конфигурации проектов.

Данная шпаргалка покрывает лишь основные особенности спецификации, поэтому для более подробного ознакомления рекомендуем обратиться к официальной спецификации YAML, а также к статьям на других ресурсах (см. “Источники” в конце документа).

Последнее изменение: 28 августа, 2023 в 21:31

Основные правила

  • В качестве отступов используются пробелы.
  • YAML регистро-зависимый.
  • Расширение файла .yaml или .yml

Ссылки

Комментарии

# однострочный комментарий

a: "test" # комментарий также можно разместить после данных

# многострочные комментарии отсутствуют
# поэтому всегда нужно ставить решетку перед
# началом комментария на новой строке

Типы данных

key1: 123 # целочисленное значение (int)
key2: 1.23 # значение с плавающей запятой (float)
key3: "abc def" # строка
key4: 'abc def' # строка
key5: abc def # строка (кавычки указывать не обязательно)
key6: true # логический тип (boolean)
key7: 2023-08-27 # тип дата (date)
key8: 2023-08-27 23:59:59 # тип дата (date)
key9: !!str 2023-08-27 # принудительное преобразование к строковому типу

Эквивалент в JSON

{
  "key1": 123,
  "key2": 1.23,
  "key3": "abc def",
  "key4": "abc def",
  "key5": "abc def",
  "key6": true,
  "key7": "2023-08-27T00:00:00.000Z",
  "key8": "2023-08-27T23:59:59.000Z",
  "key9": "2023-08-27"
}

Списки и словари

Список (последовательность, массив)

listValue1:
  - 123
  - "abc"
  - test

listValue2: [123, "abc", test]

Эквивалент в JSON

{
  "listValue1": [123, "abc", "test"],
  "listValue2": [123, "abc", "test"]
}

Многомерный список

listValue1:
  - [1, 2, 3]
  - [4, 5, 6]

listValue2:
  -
    - 1
    - 2
    - 3
  -
    - 4
    - 5
    - 6

Эквивалент в JSON

{
  "listValue1": [[1, 2, 3], [4, 5, 6]],
  "listValue2": [[1, 2, 3], [4, 5, 6]],
}

Словарь (коллекция, хэш-таблица)

dictValue1:
  key:
    subkey1: 123
    subkey2: hello

# в одну строчку
dictValue2: { key: { subkey: true }, key2: hello }

Эквивалент в JSON

{
  "dictValue1": {
    "key": {
      "subkey1": 123,
      "subkey2": "hello"
    }
  },
  "dictValue2": {
    "key": {
      "subkey": true
    },
    "key2": "hello"
  }
}

Список словарей

storage:
  - key: 1
    value: hello
  - key: 2
    value: world

Эквивалент в JSON

{
  "storage": [
    {
      "key": 1,
      "value": "hello"
    },
    {
      "key": 2,
      "value": "world"
    }
  ]
}

Строки

# все \n преобразуются в пробелы
stringValue1:
  Строка 1
  Строка 2
  Строка 3

# символы новой строки сохраняются
stringValue2: |
  Строка 1
  Строка 2
  Строка 3

# добавляет дополнительный символ новой строки
stringValue3: |+
  Строка 1
  Строка 2
  Строка 3

# удаляет последний символ новой строки
stringValue4: |-
  Строка 1
  Строка 2
  Строка 3

# все символы новой строки преобразуются в пробелы,
# кроме последнего
stringValue5: >
  Строка 1
  Строка 2
  Строка 3

Эквивалент в JSON

{
  "stringValue1": "Строка 1 Строка 2 Строка 3",
  "stringValue2": "Строка 1\nСтрока 2\nСтрока 3\n",
  "stringValue3": "Строка 1\nСтрока 2\nСтрока 3\n\n",
  "stringValue4": "Строка 1\nСтрока 2\nСтрока 3",
  "stringValue5": "Строка 1 Строка 2 Строка 3\n"
}

Несколько документов в одном файле

Каждый документ должен начинаться с разделителя --- и знака новой строки. Если в файле содержится только один документ, разделитель вставлять не обязательно.

---
# первый документ
key1: value
---
# второй документ
key1: value

Ссылки (алиасы)

a: &refName1
  test: value
b: *refName1

listA:
  - &refName2 value
  - *refName2

listB: &refName3
  - 1
  - 2
listC: *refName3
  • refName1, refName2, refName3 – названия ссылок
  • & – задает ссылку
  • * – извлекает значение по ссылке

Эквивалент в JSON

{
  "a": {
    "test": "value"
  },
  "b": {
    "test": "value"
  },
  "listA": ["value", "value"],
  "listB": [1, 2],
  "listC": [1, 2]
}

Наследование (объединение)

global_properties: &default_properties
  subkey:
   subvalue1: "hello"
   subvalue2: "world"
  key: true

my_properties:
  <<: *default_properties
  key: false
  1. Задать ссылку (в данном случае &default_properties).
  2. Наследовать значение ссылки с помощью <<: *название_ссылки.
  3. Переопределить ключи.

Эквивалент в JSON

{
  "global_properties": {
    "subkey": {
      "subvalue1": "hello",
      "subvalue2": "world"
    },
    "key": true
  },
  "my_properties": {
    "subkey": {
      "subvalue1": "hello",
      "subvalue2": "world"
    },
    "key": false
  }
}

Обратите внимание, что переопределение ключей вложенных словарей приведет к удалению всего словаря целиком.

global_properties: &default_properties
  subkey:
   subvalue1: "hello"
   subvalue2: "world"
  key: true

my_properties:
  <<: *default_properties
  subkey:
    subvalue1: "test"

Результат: ключ my_properties.subkey.subvalue2 не существует.

Эквивалент в JSON

{
  "global_properties": {
    "subkey": {
      "subvalue1": "hello",
      "subvalue2": "world"
    },
    "key": true
  },
  "my_properties": {
    "subkey": {
      "subvalue1": "test"
    },
    "key": true
  }
}

В качестве решения можно использовать отдельную ссылку на вложенный словарь.

global_subkey: &default_subkey
  subvalue1: "hello"
  subvalue2: "world"

global_properties: &default_properties
  subkey:
    <<: *default_subkey
  key: true

my_properties:
  <<: *default_properties
  subkey:
    <<: *default_subkey
    subvalue1: "test"

Результат: ключ my_properties.subkey.subvalue2 равен "world".

Эквивалент в JSON

{
  "global_subkey": {
    "subvalue1": "hello",
    "subvalue2": "world"
  },
  "global_properties": {
    "subkey": {
      "subvalue1": "hello",
      "subvalue2": "world"
    },
    "key": true
  },
  "my_properties": {
    "subkey": {
      "subvalue1": "test",
      "subvalue2": "world"
    },
    "key": true
  }
}

Источники

Прокрутить вверх