Mire használható a YAML?

Egy másik szöveges adatformátum a YAML ( Yet Another Markup Language ; később a YAML Ain't Markup Language ). Objektumok sorba rendezésére szolgál a hálózaton keresztüli átvitelhez (ahogy az XML és a JSON is használatos ilyen módon). Mivel ember által olvasható, konfigurációs fájlok írására is használják, például Docker, Kubernetes, Ansible stb. esetén. Ha a YAML-t fájlba (például konfigurációs fájlba) kell menteni, akkor a kettő egyikét használjuk. kiterjesztések: .yaml vagy .yml.

Nyelvi szintaxis

Az XML-ben a szögletes zárójeleket ( <> ) használják a címkék kijelölésére. A JSON-ban szögletes zárójeleket ( {} ) használunk . A YAML új sorokat és behúzást használ.

Az adatok kulcs-érték párokként tárolódnak, ahol a kulcs egy karakterlánc, és az érték többféle adattípus lehet (karakterlánc, szám, igaz/hamis, tömb, stb.). A kulcsokat idézőjelek nélkül írjuk.

Nézzük meg, hogyan tárolódnak az információk a YAML-ben:

típus Jáva YAML
Egész szám
int number = 5
szám: 5
Törtszám
double number = 4.3
szám: 4.3
Logikai változó
boolean valid = false
érvényes: hamis
érvényes: nem
érvényes: ki

* Érvényes logikai értékek: igaz/hamis, igen/nem, be/ki.

Húr
String city = "New York"
város: New York
város: "New York"
város: "New York"

* Mindhárom lehetőség egyenértékű.

Karakterlánc speciális karakterekkel
String line = "aaa\nbbb"
sor: "aaa\nbbb"
Megjegyzés a kódban
// comment
# megjegyzés
Tárgy
public class Person {
  String name = "Dennis";
  int age = 32;
}

* Az objektum osztálya adott, így láthatja az objektum szerkezetét.

személy:
  név: "Dennis"
  életkor: 32

* Ügyeljen az attribútumok előtti behúzásra. Minden attribútumnál azonosnak kell lennie.

Egyszerű értékek listája
var ages =
    List.of(1, 3, 5, 9, 78, -5);
korosztály: [1, 3,5,9,78, -5]
korosztály:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* Mindkét lehetőség egyenértékű.
** A lista minden eleme kötőjellel van megjelölve.

Az objektumok listája
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)      );
személyek:
  - név: "Ian"
    életkor: 21
  - név: "Marina"
    életkor: 25
  - név: "Owen"
    életkor: 73

A Java-hoz hasonlóan egy lista eleme lehet lista, vagyis az objektumok egymásba ágyazhatók. A lista következő elemét jelző kötőjel a szülőkulcshoz képest vízszintesen eltolható, vagy közvetlenül alatta helyezhető el. A lényeg az, hogy minden elem azonos formátumú legyen. Ez segít elkerülni a zavart és a kétértelmű egymásba ágyazási hierarchiát.

korosztály:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
korosztály:
- 1
- 3
- 5
- 9
- 78
- -5

A szöveges értékekkel való munka során további két árnyalat van:

  1. Többsoros szöveg. A szöveget így menthetjük el:

    többsoros szöveg: "1. sor\n2. sor\n....n. sor"

    De nagyon kellemetlen lenne megpróbálni elolvasni. Tehát ott van a | (cső) szimbólum, amellyel a szöveget másképpen írhatja:

    többsorosSzöveg: |
     1. sor
     2. sor
     ....
     sor n

    Elfogadod, hogy a második lehetőség kényelmesebb, igaz?

  2. Hosszú vonalak. Ha azt szeretné, hogy a szöveg egy sorban maradjon, de elférjen az IDE látható munkaterületén, használhatja a > (nagyobb mint) szimbólumot.

    singlelineText: >
     kezdődik
     ...
     ugyanazon sor folytatása
     ...
     vége

    A rendszer az összes szöveget egy sorként kezeli.

Ha több YAML adatstruktúrát kell egy fájlba írni, akkor ezeket --- (három kötőjel) választja el . A gyakorlatban erre ritkán van szükség, de a legjobb, ha tisztában vagyunk ezzel a lehetőséggel.

Példa egy YAML dokumentumra

Hozzunk létre valamilyen Java adatstruktúrát (egy osztályt) és egy megfelelő objektumot, és próbáljuk meg az objektumot YAML-ként ábrázolni.

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

Érvényes képviselet a YAML-ben:

---
esküvőDátum: 2000-12-03
feleség:
 név: Ann
 életkor: 37
 isNő: igen
férj:
 név: Alex
 életkor: 40
 isNő: nincs
gyerek:
 - név: Iris
   életkor: 12
   isNő: igaz
 - név: Olivia
   kor: 5
   isWoman: igaz
---