Pentru ce se utilizează YAML?

Un alt format de date text este YAML ( Yet Another Markup Language ; mai târziu, YAML Ain't Markup Language ). Este folosit pentru a serializa obiecte pentru transmisie prin rețea (la fel cum XML și JSON sunt folosite în acest fel). Deoarece este ușor de citit, este folosit și pentru a scrie fișiere de configurare, de exemplu, pentru Docker, Kubernetes, Ansible etc. Când YAML trebuie să fie salvat într-un fișier (de exemplu, un fișier de configurare), folosim unul dintre cele două extensii: .yaml sau .yml.

Sintaxa limbajului

În XML, parantezele unghiulare ( <> ) sunt folosite pentru a desemna etichete. În JSON, folosim paranteze ( {} ). YAML utilizează linii noi și indentări.

Datele sunt stocate ca perechi cheie-valoare, unde cheia este un șir, iar valoarea poate fi diferite tipuri de date (șir, număr, adevărat/fals, matrice etc.). Cheile sunt scrise fără ghilimele.

Să aruncăm o privire la modul în care sunt stocate informațiile în YAML:

Tip Java YAML
Întreg
int number = 5
număr: 5
Număr fracționar
double number = 4.3
număr: 4.3
Variabilă booleană
boolean valid = false
valid: fals
valid: nu
valid: off

* Valori booleene valide: adevărat/fals, da/nu, activat/dezactivat.

Şir
String city = "New York"
oraș: New York
oraș: „New York”
oraș: „New York”

* Toate cele trei opțiuni sunt echivalente.

Șir cu caractere speciale
String line = "aaa\nbbb"
linia: „aaa\nbbb”
Comentează în cod
// comment
# cometariu
Obiect
public class Person {
  String name = "Dennis";
  int age = 32;
}

* Clasa obiectului este dată astfel încât să puteți vedea structura obiectului.

persoană:
  nume: „Dennis”
  vârsta: 32

* Acordați atenție indentării dinaintea atributelor. Trebuie să fie același pentru toate atributele.

Lista de valori simple
var ages =
    List.of(1, 3, 5, 9, 78, -5);
varste: [1, 3,5,9,78, -5]
varste:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* Ambele opțiuni sunt echivalente.
** Fiecare element al listei este marcat cu o cratimă.

Lista de obiecte
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)      );
persoane:
  - nume: "Ian"
    varsta: 21
  - nume: "Marina"
    varsta: 25
  - nume: "Owen"
    varsta: 73

Ca și în Java, un element al unei liste poate fi o listă, adică obiectele pot fi imbricate unul în celălalt. Cratima care indică următorul element al listei poate fi decalată orizontal în raport cu cheia părinte sau situată direct sub aceasta. Principalul lucru este că toate elementele au același format. Acest lucru va ajuta la evitarea confuziei și a unei ierarhii ambigue de cuibărire.

varste:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
varste:
- 1
- 3
- 5
- 9
- 78
- -5

Mai există două nuanțe atunci când lucrați cu valori de text:

  1. Text cu mai multe linii. Putem salva text astfel:

    multilineText: „linia 1\nlinia 2\n....linia n”

    Dar ar fi foarte neplăcut să încerci să citești asta. Deci există | simbol (țeavă), pe care îl puteți folosi pentru a scrie textul diferit:

    multilineText: |
     rândul 1
     rândul 2
     ....
     rândul n

    Veți fi de acord că a doua opțiune este mai convenabilă, nu?

  2. Linii lungi. Dacă doriți să păstrați textul pe o singură linie, dar doriți să se încadreze și în spațiul de lucru vizibil al IDE-ului, puteți utiliza simbolul > (mai mare decât).

    singlelineText: >
     începe
     ...
     continua aceeași linie
     ...
     sfârșit

    Tot textul va fi tratat ca o singură linie.

Dacă trebuie să scrieți mai multe structuri de date YAML într-un singur fișier, atunci trebuie să le separați cu --- (trei cratime). În practică, rareori este nevoie de acest lucru, dar cel mai bine este să fii conștient de această posibilitate.

Exemplu de document YAML

Să creăm o structură de date Java (o clasă) și un obiect corespunzător și să încercăm să reprezentăm obiectul ca 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);
}

Reprezentare validă în YAML:

---
nuntaData: 2000-12-03
sotie:
 nume: Ann
 varsta: 37
 isFemeie: da
sotul:
 nume: Alex
 varsta: 40
 isFemeie: fara
copii:
 - nume: Iris
   varsta: 12
   isFemeie: adevarat
 - nume: Olivia
   varsta: 5
   esteFemeie: adevărat
---