Hva brukes YAML til?

Et annet tekstdataformat er YAML ( Yet Another Markup Language ; senere YAML Ain't Markup Language ). Den brukes til å serialisere objekter for overføring over nettverket (akkurat som XML og JSON brukes på denne måten). Fordi den er lesbar for mennesker, brukes den også til å skrive konfigurasjonsfiler, for eksempel for Docker, Kubernetes, Ansible, etc. Når YAML må lagres i en fil (for eksempel en konfigurasjonsfil), bruker vi en av to utvidelser: .yaml eller .yml.

Språksyntaks

I XML brukes vinkelparenteser ( <> ) for å angi tagger. I JSON bruker vi krøllede parenteser ( {} ). YAML bruker nye linjer og innrykk.

Dataene lagres som nøkkel-verdi-par, hvor nøkkelen er en streng, og verdien kan være ulike datatyper (streng, tall, sant/falsk, matrise, etc.). Nøkler er skrevet uten anførselstegn.

La oss ta en titt på hvordan informasjon lagres i YAML:

Type Java YAML
Heltall
int number = 5
nummer: 5
Brøktal
double number = 4.3
tall: 4,3
Boolsk variabel
boolean valid = false
gyldig: usant
gyldig: nei
gyldig: av

* Gyldige boolske verdier: sann/falsk, ja/nei, på/av.

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

* Alle tre alternativene er likeverdige.

String med spesialtegn
String line = "aaa\nbbb"
linje: "aaa\nbbb"
Kommenter i kode
// comment
# kommentar
Gjenstand
public class Person {
  String name = "Dennis";
  int age = 32;
}

* Objektets klasse er gitt slik at du kan se strukturen til objektet.

person:
  navn: "Dennis"
  alder: 32

* Vær oppmerksom på innrykk før attributtene. Det må være likt for alle attributter.

Liste over enkle verdier
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 alternativene er likeverdige.
** Hvert element i listen er merket med en bindestrek.

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 si at objekter kan nestes inne i hverandre. Bindestreken som indikerer det neste elementet i listen kan forskyves horisontalt i forhold til overordnet nøkkel, eller plassert rett under den. Hovedsaken er at alle elementene har samme format. Dette vil bidra til å unngå forvirring og et tvetydig hekkehierarki.

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

Det er to nyanser til når du arbeider med tekstverdier:

  1. Flerlinjetekst. Vi kan lagre tekst slik:

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

    Men det ville vært veldig ubehagelig å prøve å lese det. Så det er | (pipe) symbol, som du kan bruke til å skrive teksten annerledes:

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

    Du er enig i at det andre alternativet er mer praktisk, ikke sant?

  2. Lange linjer. Hvis du vil beholde teksten på én linje, men også vil at den skal passe inn i IDEs synlige arbeidsområde, kan du bruke > (større enn)-symbolet.

    singlelineText: >
     begynne
     ...
     fortsett samme linje
     ...
     slutt

    All tekst vil bli behandlet som én linje.

Hvis du trenger å skrive flere YAML-datastrukturer i én fil, må du skille dem med --- (tre bindestreker). I praksis er det sjelden behov for dette, men det er best å være klar over denne muligheten.

Eksempel på et YAML-dokument

La oss lage en Java-datastruktur (en klasse) og et tilsvarende objekt, og prøve å representere 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 representasjon i YAML:

---
bryllup Dato: 2000-12-03
kone:
 navn: Ann
 alder: 37
 er Kvinne: ja
mann:
 navn: Alex
 alder: 40
 er Kvinne: ingen
barn:
 - navn: Iris
   alder: 12
   er Kvinne: sant
 - navn: Olivia
   alder: 5
   isWoman: sant
---