1 Востаннє редагувалося leofun01 (09.09.2018 18: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, вам сюди. На цьому поки зупинюсь.

Подякували: varkon, /KIT\, FakiNyan, ostap34PHP, koala, Xackspel, ReAl, P.Y.8