За Howво се използва YAML?

Друг формат на текстови данни е YAML ( Yet Another Markup Language ; по-късно, YAML Ain't Markup Language ). Използва се за сериализиране на обекти за предаване по мрежата (точно Howто XML и JSON се използват по този начин). Тъй като е четим от хора, той се използва и за писане на конфигурационни файлове, например за Docker, Kubernetes, Ansible и т.н. Когато YAML трябва да бъде записан във файл (например конфигурационен файл), ние използваме един от двата разширения: .yaml or .yml.

Синтаксис на езика

В XML ъглови скоби ( <> ) се използват за обозначаване на тагове. В JSON използваме къдрави скоби ( {} ). YAML използва нови редове и отстъпи.

Данните се съхраняват като двойки ключ-стойност, където ключът е низ, а стойността може да бъде различни типове данни (низ, число, вярно/невярно, масив и т.н.). Ключовете са написани без кавички.

Нека да разгледаме How се съхранява информацията в YAML:

Тип Java YAML
Цяло число
int number = 5
номер: 5
Дробно число
double number = 4.3
номер: 4.3
Булева променлива
boolean valid = false
валидно: невярно
валидно: не
валидно: изключено

* Валидни булеви стойности: true/false, yes/no, on/off.

низ
String city = "New York"
град: Ню Йорк
град: "Ню Йорк"
град: "Ню Йорк"

* И трите опции са еквивалентни.

Низ със специални знаци
String line = "aaa\nbbb"
ред: "aaa\nbbb"
Коментар в code
// comment
# коментар
Обект
public class Person {
  String name = "Dennis";
  int age = 32;
}

* Класът на обекта е даден, за да можете да видите структурата на обекта.

лице:
  име: "Денис"
  възраст: 32г

* Обърнете внимание на отстъпа преди атрибутите. Трябва да е еднакъв за всички атрибути.

Списък с прости стойности
var ages =
    List.of(1, 3, 5, 9, 78, -5);
възраст: [1, 3,5,9,78, -5]
възраст:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* И двете опции са еквивалентни.
** Всеки елемент от списъка е отбелязан с тире.

Списък на обектите
class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}List<Person> people = List.of(
        new Person("Ian", 21),
        new Person("Marina", 25),
        new Person("Owen", 73)      );
хора:
  - име: "Иън"
    възраст: 21
  - име: "Марина"
    възраст: 25
  - име: "Оуен"
    възраст: 73

Както в Java, елемент от списък може да бъде списък, тоест обектите могат да бъдат вложени един в друг. Тирето, което показва следващия елемент от списъка, може да бъде хоризонтално изместено спрямо родителския ключ or разположено директно под него. Основното е, че всички елементи имат еднакъв формат. Това ще помогне да се избегне объркване и двусмислена йерархия на влагане.

възраст:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
възраст:
- 1
- 3
- 5
- 9
- 78
- -5

Има още два нюанса при работа с текстови стойности:

  1. Многоредов текст. Можем да запазим текст по този начин:

    multilineText: "ред 1\nред 2\n....ред n"

    Но би било много неприятно да се опитам да прочета това. Така че има | символ (тръба), който можете да използвате, за да напишете текста по различен начин:

    многоредов текст: |
     ред 1
     ред 2
     ....
     ред n

    Ще се съгласите, че вторият вариант е по-удобен, нали?

  2. Дълги линии. Ако искате да запазите текста на един ред, но също така искате да се побере във видимото работно пространство на IDE, можете да използвате символа > (по-голямо от).

    singlelineText: >
     начало
     ...
     продължаване на същия ред
     ...
     край

    Целият текст ще се третира като един ред.

Ако трябва да запишете няколко YAML структури от данни в един файл, тогава трябва да ги разделите с --- (три тирета). На практика рядко има нужда от това, но е добре да сте наясно с тази възможност.

Пример за YAML document

Нека създадем няHowва структура от данни на Java (клас) и съответен обект и се опитаме да представим обекта като YAML.

class Family {
   private Date weddingDate;
   private Person wife;
   private Person husband;
   private List<Person> children;

   // Getters and setters are omitted
}

class Person {
   private final String name;
   private final boolean isWoman;
   private int age;

   public Person(String name, int age, boolean isWoman) {
       this.name = name;
       this.age = age;
       this.isWoman = isWoman;
   }

// Getters and setters are omitted

}

public static void main(String[] args) {
   Person wife = new Person("Ann", 37, true);
   Person husband = new Person("Alex", 40, false);
   var children = List.of(
           new Person("Iris", 12, true),
           new Person("Olivia", 5, true)
   );
   Date weddingDate = new Date(/* some long */);

   Family family = new Family();
   family.setWeddingDate(weddingDate);
   family.setWife(wife);
   family.setHusband(husband);
   family.setChildren(children);
}

Валидно представяне в YAML:

---
сватбена дата: 2000-12-03
съпруга:
 име: Ann
 възраст: 37
 е жена: да
съпруг:
 име: Алекс
 възраст: 40
 е жена: няма
деца:
 - име: Айрис
   възраст: 12
   е жена: вярно
 - име: Оливия
   възраст: 5
   isWoman: вярно
---