1 Востаннє редагувалося leofun01 (09.09.2018 17:26:30)

Тема: YAML [Стаття]

Назва

YAML - це рекурсивний акронім від "YAML Ain't Markup Language" / "YAML не є мовою розмітки" (прям як GNU - "GNU's Not Unix").

Що таке YAML

Це стандарт серіалізації даних, який можна використовувати в будь-якій мові програмування.

На момент створення цієї теми останньою версією був YAML 1.2, нижче буде описано тільки цю версію (доки не вказано інше).

Переваги

Про офіційно заявлені переваги можна почитати тут.
А тепер про реальні переваги:

  1. Не засмічений зайвим текстом (таким як теги в XML або дужки в JSON).

  2. Строго структурований. Не має виключень із правил.

  3. Рівень вкладеності визначається відступами (як в Python), або дужками.

  4. Парсинг серіалізованих даних потребує тільки один прохід (для програміста це важливо).

  5. Схожий на JSON.

Для чого вчити YAML

Колись ви захочете створити собі сайт на GitHub Pages, а там Jekyll, а там *.yml файли, от і приїхали.

Як конвертувати JSON в YAML або YAML в JSON

Можу порекомендувати json2yaml.com.
Або шукайте самі.

Як виглядає YAML код

Приклади взяв звідси.
Послідовність значень :

- Адріян Ігорович
- Очі.завидющі
- Master_Sergius

Відображення значень в значення :

user: Cyan        # user name
mc:   2102        # messages count
date: 2013-02-26  # registered

Відображення значень в послідовності :

Користувачі:
  - bvn
  - ostap34PHP
  - Lordie
Модератори:
  - Arete
  - koala
  - 0xDADA11C7

Послідовність відображень :

-
  user: P.Y.
  mc:   3730
  date: 2013-02-19
-
  user: Monolith
  mc:   706
  date: 2014-07-29

Послідовність послідовностей :

-
  - user
  - mc
  - date
-
  - P.Y.
  - 3730
  - 2013-02-19
-
  - Monolith
  - 706
  - 2014-07-29

або табличний варіант

- [user    , mc  , date      ]
- [P.Y.    , 3730, 2013-02-19]
- [Monolith, 706 , 2014-07-29]

Відображення відображень :

P.Y.: {mc: 3730, date: 2013-02-19}
Monolith: {mc: 706, date: 2014-07-29}

або

P.Y.: {
    mc: 3730,
    date: 2013-02-19
  }
Monolith: {
    mc: 706,
    date: 2014-07-29
  }

Структури :
YAML використовує "---" щоб відділити директиви від іншого вмісту документу.
2 документи в потоці (кожен позначений коментарем) :

# Ranking of 1998 home runs
---
- Mark McGwire
- Sammy Sosa
- Ken Griffey

# Team ranking
---
- Chicago Cubs
- St Louis Cardinals

"..." позначають кінець документу без переходу на наступний (використовуються в каналах новин) :

---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...

Елементи, які повторюються, спочатку позначаються через "&" і потім використовуються як посилання через "*".
Документ без посилань на повторювані елементи :

---
hr:
  - Mark McGwire
  - Sammy Sosa
rbi:
  - Sammy Sosa
  - Ken Griffey

Документ з посиланням на повторювані елементи :

---
hr:
  - Mark McGwire
  # Following node labeled SS
  - &SS Sammy Sosa
rbi:
  - *SS # Subsequent occurrence
  - Ken Griffey

"? " позначає ключ явного/складного відображення (a complex mapping key) :

? - Detroit Tigers
  - Chicago cubs
:
  - 2001-07-23

? [ New York Yankees,
    Atlanta Braves ]
: [ 2001-07-02, 2001-08-12,
    2001-08-14 ]

Такий приклад деякий час мене конфузив, тому залишу пояснення :

- Detroit Tigers
- Chicago cubs

це перший ключ.

- 2001-07-23

це "перше значення", значення для першого ключа.

[ New York Yankees,
  Atlanta Braves ]

це другий ключ.

[ 2001-07-02, 2001-08-12,
  2001-08-14 ]

це "друге значення".

Тобто наступні 2 коди дають однаковий результат :
1

---
# Products purchased
- item    : Super Hoop
  quantity: 1
- item    : Basketball
  quantity: 4

2

---
# Products purchased
-
  ? item
  : Super Hoop
  ? quantity
  : 1
-
  ? item
  : Basketball
  ? quantity
  : 4

Кому цікаво продовжити вивчення YAML, вам сюди. На цьому поки зупинюсь.