Hvad bruges YAML til?

Et andet tekstdataformat er YAML ( Yet Another Markup Language ; senere YAML Ain't Markup Language ). Det bruges til at serialisere objekter til transmission over netværket (ligesom XML og JSON bruges på denne måde). Fordi det er læseligt for mennesker, bruges det også til at skrive konfigurationsfiler, for eksempel til Docker, Kubernetes, Ansible osv. Når YAML skal gemmes i en fil (for eksempel en konfigurationsfil), bruger vi en af ​​to udvidelser: .yaml eller .yml.

Sprog syntaks

I XML bruges vinkelparenteser ( <> ) til at udpege tags. I JSON bruger vi krøllede parenteser ( {} ). YAML bruger nye linjer og indrykning.

Dataene gemmes som nøgle-værdi-par, hvor nøglen er en streng, og værdien kan være forskellige datatyper (streng, tal, sand/falsk, matrix osv.). Nøgler er skrevet uden anførselstegn.

Lad os tage et kig på, hvordan information gemmes i YAML:

Type Java YAML
Heltal

int number = 5
nummer: 5
Brøktal

double number = 4.3
antal: 4,3
Boolesk variabel

boolean valid = false
gyldig: falsk
gyldig: ingen
gyldig: fra

* Gyldige booleske værdier: sand/falsk, ja/nej, til/fra.

Snor

String city = "New York"
by: New York
by: 'New York'
by: "New York"

* Alle tre muligheder er ækvivalente.

Streng med specialtegn

String line = "aaa\nbbb"
linje: "aaa\nbbb"
Kommenter i kode

// comment
# kommentar
Objekt

public class Person {
  String name = "Dennis";
  int age = 32;
}

* Objektets klasse er givet, så du kan se objektets struktur.

person:
  navn: "Dennis"
  alder: 32

* Vær opmærksom på indrykket før attributterne. Det skal være det samme for alle attributter.

Liste over simple værdier

var ages = 
    List.of(1, 3, 5, 9, 78, -5);
aldre: [1, 3,5,9,78, -5]
aldre:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* Begge muligheder er ækvivalente.
** Hvert element på listen er markeret med en bindestreg.

Liste over objekter

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)      );
personer:
  - navn: "Ian"
    alder: 21
  - navn: "Marina"
    alder: 25
  - navn: "Owen"
    alder: 73

Som i Java kan et element i en liste være en liste, det vil sige, at objekter kan indlejres inde i hinanden. Bindestregen, der angiver det næste element på listen, kan forskydes vandret i forhold til den overordnede nøgle eller placeres direkte under den. Det vigtigste er, at alle elementer har samme format. Dette vil hjælpe med at undgå forvirring og et tvetydigt indlejringshierarki.

aldre:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
aldre:
- 1
- 3
- 5
- 9
- 78
- -5

Der er yderligere to nuancer, når du arbejder med tekstværdier:

  1. Multiline tekst. Vi kan gemme tekst som denne:

    multilineText: "linje 1\nlinje 2\n....linje n"

    Men det ville være meget ubehageligt at prøve at læse det. Så der er | (rør) symbol, som du kan bruge til at skrive teksten anderledes:

    multilineTekst: |
     linje 1
     linje 2
     ....
     linje n

    Du er enig i, at den anden mulighed er mere praktisk, ikke?

  2. Lange køer. Hvis du vil beholde teksten på én linje, men også vil have den til at passe ind i IDE'ens synlige arbejdsområde, kan du bruge symbolet > (større end).

    singlelineText: >
     start
     ...
     fortsæt samme linje
     ...
     slut

    Al tekst vil blive behandlet som én linje.

Hvis du skal skrive flere YAML-datastrukturer i én fil, så skal du adskille dem med --- (tre bindestreger). I praksis er der sjældent behov for dette, men det er bedst at være opmærksom på denne mulighed.

Eksempel på et YAML-dokument

Lad os skabe noget Java-datastruktur (en klasse) og et tilsvarende objekt og prøve at repræsentere objektet som 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);
}

Gyldig repræsentation i YAML:

---
bryllupDato: 2000-12-03
hustru:
 navn: Ann
 alder: 37
 er Kvinde: ja
mand:
 navn: Alex
 alder: 40
 er Kvinde: ingen
børn:
 - navn: Iris
   alder: 12
   er Kvinde: sand
 - navn: Olivia
   alder: 5
   isWoman: sandt
---