A cosa serve YAML?

Un altro formato di dati di testo è YAML ( Yet Another Markup Language ; in seguito, YAML Ain't Markup Language ). Viene utilizzato per serializzare oggetti per la trasmissione sulla rete (proprio come XML e JSON vengono utilizzati in questo modo). Poiché è leggibile dall'uomo, viene utilizzato anche per scrivere file di configurazione, ad esempio per Docker, Kubernetes, Ansible, ecc. Quando YAML deve essere salvato in un file (ad esempio, un file di configurazione), utilizziamo uno dei due estensioni: .yaml o .yml.

Sintassi del linguaggio

In XML, le parentesi angolari ( <> ) vengono utilizzate per designare i tag. In JSON, utilizziamo le parentesi graffe ( {} ). YAML utilizza nuove righe e indentazione.

I dati vengono archiviati come coppie chiave-valore, dove la chiave è una stringa e il valore può essere di vari tipi di dati (stringa, numero, vero/falso, matrice e così via). Le chiavi sono scritte senza virgolette.

Diamo un'occhiata a come le informazioni vengono archiviate in YAML:

Tipo Giava YAML
Numero intero
int number = 5
numero: 5
Numero frazionario
double number = 4.3
numero: 4.3
Variabile booleana
boolean valid = false
valido: falso
valido: no
valido: off

* Valori booleani validi: vero/falso, sì/no, on/off.

Corda
String city = "New York"
città: New York
città: 'New York'
città: "New York"

* Tutte e tre le opzioni sono equivalenti.

Stringa con caratteri speciali
String line = "aaa\nbbb"
riga: "aaa\nbbb"
Commento in codice
// comment
# commento
Oggetto
public class Person {
  String name = "Dennis";
  int age = 32;
}

* La classe dell'oggetto è data in modo da poter vedere la struttura dell'oggetto.

persona:
  nome: "Dennis"
  età: 32

* Prestare attenzione al rientro prima degli attributi. Deve essere uguale per tutti gli attributi.

Elenco di valori semplici
var ages =
    List.of(1, 3, 5, 9, 78, -5);
età: [1, 3,5,9,78, -5]
età:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* Entrambe le opzioni sono equivalenti.
** Ogni elemento dell'elenco è contrassegnato da un trattino.

Elenco degli oggetti
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)      );
persone:
  - nome: "Ian"
    età: 21
  - nome: "Marina"
    età: 25
  - nome: "Owen"
    età: 73

Come in Java, un elemento di una lista può essere una lista, cioè gli oggetti possono essere annidati l'uno dentro l'altro. Il trattino che indica l'elemento successivo dell'elenco può essere sfalsato orizzontalmente rispetto alla chiave principale o posizionato direttamente sotto di essa. La cosa principale è che tutti gli elementi hanno lo stesso formato. Ciò contribuirà a evitare confusione e una gerarchia di nidificazione ambigua.

età:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
età:
- 1
- 3
- 5
- 9
- 78
- -5

Ci sono altre due sfumature quando si lavora con i valori di testo:

  1. Testo multilinea. Possiamo salvare il testo in questo modo:

    multilineText: "riga 1\nriga 2\n....riga n"

    Ma sarebbe molto spiacevole provare a leggerlo. Quindi c'è il | simbolo (pipa), che puoi utilizzare per scrivere il testo in modo diverso:

    testo multilinea: |
     linea 1
     linea 2
     ....
     linea n

    Sarai d'accordo che la seconda opzione è più conveniente, giusto?

  2. Linee lunghe. Se vuoi mantenere il testo su una riga ma vuoi anche che rientri nell'area di lavoro visibile dell'IDE, puoi usare il simbolo > (maggiore di).

    singlelineText: >
     inizio
     ...
     continua stessa riga
     ...
     fine

    Tutto il testo verrà trattato come una riga.

Se devi scrivere diverse strutture di dati YAML in un file, devi separarle con --- (tre trattini). In pratica, raramente ce n'è bisogno, ma è meglio essere consapevoli di questa possibilità.

Esempio di un documento YAML

Creiamo una struttura dati Java (una classe) e un oggetto corrispondente e proviamo a rappresentare l'oggetto come 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);
}

Rappresentazione valida in YAML:

---
weddingDate: 2000-12-03
moglie:
 nome: Ann
 età: 37
 isDonna: si
marito:
 nome: Alex
 età: 40
 isDonna: no
figli:
 - nome: Iris
   età: 12
   isDonna: true
 - nome: Olivia
   età: 5
   isDonna: vero
---