Vad används YAML för?

Ett annat textdataformat är YAML ( Yet Another Markup Language ; senare YAML Ain't Markup Language ). Det används för att serialisera objekt för överföring över nätverket (precis som XML och JSON används på detta sätt). Eftersom den är läsbar för människor används den även för att skriva konfigurationsfiler, till exempel för Docker, Kubernetes, Ansible, etc. När YAML behöver sparas till en fil (till exempel en konfigurationsfil) använder vi en av två tillägg: .yaml eller .yml.

Språksyntax

I XML används vinkelparenteser ( <> ) för att beteckna taggar. I JSON använder vi parenteser ( {} ). YAML använder nya linjer och indrag.

Data lagras som nyckel-värdepar, där nyckeln är en sträng, och värdet kan vara olika datatyper (sträng, tal, sant/falskt, matris, etc.). Nycklar skrivs utan citattecken.

Låt oss ta en titt på hur information lagras i YAML:

Typ Java YAML
Heltal
int number = 5
nummer: 5
Bråktal
double number = 4.3
antal: 4,3
Boolesk variabel
boolean valid = false
giltigt: falskt
giltigt: nej
giltigt: av

* Giltiga booleska värden: sant/falskt, ja/nej, på/av.

Sträng
String city = "New York"
stad: New York
stad: 'New York'
stad: "New York"

* Alla tre alternativen är likvärdiga.

Sträng med specialtecken
String line = "aaa\nbbb"
rad: "aaa\nbbb"
Kommentera i koden
// comment
# kommentar
Objekt
public class Person {
  String name = "Dennis";
  int age = 32;
}

* Objektets klass anges så att du kan se objektets struktur.

person:
  namn: "Dennis"
  ålder: 32

* Var uppmärksam på indraget före attributen. Det måste vara samma för alla attribut.

Lista över enkla värden
var ages =
    List.of(1, 3, 5, 9, 78, -5);
åldrar: [1, 3,5,9,78, -5]
åldrar:
  -1
  - 3
  - 5
  - 9
  - 78
  - -5

* Båda alternativen är likvärdiga.
** Varje element i listan är markerat med ett bindestreck.

Lista över objekt
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:
  - namn: "Ian"
    ålder: 21
  - namn: "Marina"
    ålder: 25
  - namn: "Owen"
    ålder: 73

Som i Java kan ett element i en lista vara en lista, det vill säga objekt kan kapslas inuti varandra. Bindestrecket som indikerar nästa element i listan kan förskjutas horisontellt i förhållande till den överordnade nyckeln, eller placeras direkt under den. Huvudsaken är att alla element har samma format. Detta kommer att hjälpa till att undvika förvirring och en tvetydig kapselhierarki.

åldrar:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
åldrar:
- 1
- 3
- 5
- 9
- 78
- -5

Det finns ytterligare två nyanser när man arbetar med textvärden:

  1. Flerradstext. Vi kan spara text så här:

    multilineText: "rad 1\nrad 2\n....rad n"

    Men det skulle vara väldigt obehagligt att försöka läsa det. Så det finns | (rör) symbol, som du kan använda för att skriva texten annorlunda:

    multilineText: |
     rad 1
     rad 2
     ....
     rad n

    Du håller med om att det andra alternativet är bekvämare, eller hur?

  2. Långa linjer. Om du vill behålla texten på en rad men också vill att den ska passa i IDE:ns synliga arbetsyta kan du använda symbolen > (större än).

    singlelineText: >
     börja
     ...
     fortsätt på samma rad
     ...
     slut

    All text kommer att behandlas som en rad.

Om du behöver skriva flera YAML-datastrukturer till en fil, måste du separera dem med --- (tre bindestreck). I praktiken finns det sällan behov av detta, men det är bäst att vara medveten om denna möjlighet.

Exempel på ett YAML-dokument

Låt oss skapa lite Java-datastruktur (en klass) och ett motsvarande objekt och försöka representera 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);
}

Giltig representation i YAML:

---
bröllopDatum: 2000-12-03
fru:
 namn: Ann
 ålder: 37
 ärKvinna: ja
man:
 namn: Alex
 ålder: 40
 ärKvinna: inga
barn:
 - namn: Iris
   ålder: 12
   ärKvinna: sant
 - namn: Olivia
   ålder: 5
   isWoman: sant
---