Waar wordt YAML voor gebruikt?

Een ander formaat voor tekstgegevens is YAML ( Yet Another Markup Language ; later YAML Ain't Markup Language ). Het wordt gebruikt om objecten te serialiseren voor verzending via het netwerk (net zoals XML en JSON op deze manier worden gebruikt). Omdat het leesbaar is voor mensen, wordt het ook gebruikt om configuratiebestanden te schrijven, bijvoorbeeld voor Docker, Kubernetes, Ansible, etc. Wanneer YAML moet worden opgeslagen in een bestand (bijvoorbeeld een configuratiebestand), gebruiken we een van de twee extensies: .yaml of .yml.

Taal syntaxis

In XML worden punthaken ( <> ) gebruikt om tags aan te duiden. In JSON gebruiken we accolades ( {} ). YAML gebruikt nieuwe regels en inspringing.

De gegevens worden opgeslagen als sleutel-waardeparen, waarbij de sleutel een tekenreeks is en de waarde verschillende gegevenstypen kan zijn (tekenreeks, getal, waar/onwaar, array, enz.). Toetsen worden geschreven zonder aanhalingstekens.

Laten we eens kijken hoe informatie wordt opgeslagen in YAML:

Type Java YAML
Geheel getal
int number = 5
nummer 5
Fractionele getal
double number = 4.3
aantal: 4.3
Booleaanse variabele
boolean valid = false
geldig: onwaar
geldig: nee
geldig: uit

* Geldige booleaanse waarden: waar/onwaar, ja/nee, aan/uit.

Snaar
String city = "New York"
stad: New York
stad: 'New York'
stad: "New York"

* Alle drie de opties zijn gelijkwaardig.

Tekenreeks met speciale tekens
String line = "aaa\nbbb"
regel: "aaa\nbbb"
Reageer in code
// comment
# opmerking
Voorwerp
public class Person {
  String name = "Dennis";
  int age = 32;
}

* De klasse van het object wordt gegeven zodat u de structuur van het object kunt zien.

persoon:
  naam: "Dennis"
  leeftijd: 32

* Let op de inspringing voor de attributen. Het moet hetzelfde zijn voor alle attributen.

Lijst met eenvoudige waarden
var ages =
    List.of(1, 3, 5, 9, 78, -5);
leeftijden: [1, 3,5,9,78, -5]
leeftijden:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* Beide opties zijn gelijkwaardig.
** Elk element van de lijst is gemarkeerd met een koppelteken.

Lijst met objecten
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)      );
personen:
  - naam: "Ian"
    leeftijd: 21
  - naam: "Marina"
    leeftijd: 25
  - naam: "Owen"
    leeftijd: 73

Net als in Java kan een element van een lijst een lijst zijn, dat wil zeggen dat objecten in elkaar kunnen worden genest. Het koppelteken dat het volgende element van de lijst aangeeft, kan horizontaal worden verschoven ten opzichte van de bovenliggende sleutel of er direct onder worden geplaatst. Het belangrijkste is dat alle elementen hetzelfde formaat hebben. Dit voorkomt verwarring en een dubbelzinnige nesthiërarchie.

leeftijden:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
leeftijden:
- 1
- 3
- 5
- 9
- 78
- -5

Er zijn nog twee nuances bij het werken met tekstwaarden:

  1. Meerregelige tekst. We kunnen tekst als volgt opslaan:

    multilineText: "regel 1\nregel 2\n....regel n"

    Maar het zou erg onaangenaam zijn om dat te proberen te lezen. Dus daar is de | (pijp) symbool, waarmee je de tekst anders kunt schrijven:

    multilineText: |
     regel 1
     regel 2
     ....
     regel n

    U zult het ermee eens zijn dat de tweede optie handiger is, toch?

  2. Lange rijen. Als u de tekst op één regel wilt houden, maar ook wilt dat deze in de zichtbare werkruimte van de IDE past, kunt u het > -symbool (groter dan) gebruiken.

    singlelineText: >
     begin
     ...
     ga verder met dezelfde regel
     ...
     einde

    Alle tekst wordt behandeld als één regel.

Als u meerdere YAML-gegevensstructuren in één bestand moet schrijven, moet u ze scheiden met --- (drie koppeltekens). In de praktijk is hier zelden behoefte aan, maar u dient zich best bewust te zijn van deze mogelijkheid.

Voorbeeld van een YAML-document

Laten we een Java-gegevensstructuur (een klasse) en een bijbehorend object maken en proberen het object als YAML weer te geven.

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);
}

Geldige weergave in YAML:

---
trouwdatum: 03-12-2000
echtgenote:
 naam: Ann
 leeftijd: 37
 isvrouw: ja
echtgenoot:
 naam: Alex
 leeftijd: 40
 isvrouw: geen
kinderen:
 - naam: Iris
   leeftijd: 12
   isvrouw: waar
 - naam: Olivia
   leeftijd: 5
   isWoman: waar
---