Wofür wird YAML verwendet?

Ein weiteres Textdatenformat ist YAML ( Yet Another Markup Language ; später YAML Ain't Markup Language ). Es wird verwendet, um Objekte für die Übertragung über das Netzwerk zu serialisieren (so wie XML und JSON auf diese Weise verwendet werden). Da es für Menschen lesbar ist, wird es auch zum Schreiben von Konfigurationsdateien verwendet, beispielsweise für Docker, Kubernetes, Ansible usw. Wenn YAML in einer Datei (z. B. einer Konfigurationsdatei) gespeichert werden muss, verwenden wir eine von zwei Erweiterungen: .yaml oder .yml.

Sprachsyntax

In XML werden spitze Klammern ( <> ) zur Bezeichnung von Tags verwendet. In JSON verwenden wir geschweifte Klammern ( {} ). YAML verwendet neue Zeilen und Einrückungen.

Die Daten werden als Schlüssel-Wert-Paare gespeichert, wobei der Schlüssel eine Zeichenfolge ist und der Wert verschiedene Datentypen haben kann (Zeichenfolge, Zahl, wahr/falsch, Array usw.). Schlüssel werden ohne Anführungszeichen geschrieben.

Werfen wir einen Blick darauf, wie Informationen in YAML gespeichert werden:

Typ Java YAML
Ganze Zahl
int number = 5
Nummer 5
Bruchzahl
double number = 4.3
Nummer: 4.3
Boolesche Variable
boolean valid = false
gültig: falsch
gültig: nein
gültig: aus

* Gültige boolesche Werte: wahr/falsch, ja/nein, ein/aus.

Zeichenfolge
String city = "New York"
Stadt: New York
Stadt: „New York“
Stadt: „New York“

* Alle drei Optionen sind gleichwertig.

String mit Sonderzeichen
String line = "aaa\nbbb"
Zeile: „aaa\nbbb“
Kommentar im Code
// comment
# Kommentar
Objekt
public class Person {
  String name = "Dennis";
  int age = 32;
}

* Die Klasse des Objekts wird angegeben, damit Sie die Struktur des Objekts sehen können.

Person:
  Name: „Dennis“
  Alter: 32

* Achten Sie auf die Einrückung vor den Attributen. Es muss für alle Attribute gleich sein.

Liste einfacher Werte
var ages =
    List.of(1, 3, 5, 9, 78, -5);
Alter: [1, 3,5,9,78, -5]
Alter:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* Beide Optionen sind gleichwertig.
** Jedes Element der Liste ist mit einem Bindestrich gekennzeichnet.

Liste der Objekte
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:
  - Name: „Ian“
    Alter: 21
  – Name: „Marina“
    Alter: 25
  – Name: „Owen“
    Alter: 73

Wie in Java kann ein Element einer Liste eine Liste sein, das heißt, Objekte können ineinander verschachtelt sein. Der Bindestrich, der das nächste Element der Liste angibt, kann horizontal relativ zum übergeordneten Schlüssel versetzt oder direkt darunter platziert werden. Hauptsache, alle Elemente haben das gleiche Format. Dies trägt dazu bei, Verwirrung und eine mehrdeutige Verschachtelungshierarchie zu vermeiden.

Alter:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
Alter:
- 1
- 3
- 5
- 9
- 78
- -5

Beim Arbeiten mit Textwerten gibt es zwei weitere Nuancen:

  1. Mehrzeiliger Text. Wir können Text wie folgt speichern:

    multilineText: „Zeile 1\nZeile 2\n....Zeile n“

    Aber es wäre sehr unangenehm, das lesen zu wollen. Es gibt also das | (Pipe-)Symbol, mit dem Sie den Text anders schreiben können:

    mehrzeiliger Text: |
     Zeile 1
     Zeile 2
     ....
     Zeile n

    Sie stimmen zu, dass die zweite Option bequemer ist, oder?

  2. Lange Linien. Wenn Sie möchten, dass der Text in einer Zeile bleibt, er aber auch in den sichtbaren Arbeitsbereich der IDE passt, können Sie das Symbol > (größer als) verwenden.

    singlelineText: >
     begin
     ...
     gleiche Zeile fortsetzen
     ...
     end

    Der gesamte Text wird als eine Zeile behandelt.

Wenn Sie mehrere YAML-Datenstrukturen in eine Datei schreiben müssen, müssen Sie diese durch --- (drei Bindestriche) trennen. In der Praxis ist dies selten erforderlich, aber es ist am besten, sich dieser Möglichkeit bewusst zu sein.

Beispiel eines YAML-Dokuments

Lassen Sie uns eine Java-Datenstruktur (eine Klasse) und ein entsprechendes Objekt erstellen und versuchen, das Objekt als YAML darzustellen.

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

Gültige Darstellung in YAML:

---
Hochzeitsdatum: 03.12.2000
Ehefrau:
 Name: Ann
 Alter: 37 Jahre
 Frau: Ja
Ehemann:
 Name: Alex
 Alter: 40 Jahre
 Frau: keine
Kinder:
 - Name: Iris
   Alter: 12 Jahre
   Frau: wahr
 - Name: Olivia
   Alter: 5
   isWoman: wahr
---