À quoi sert YAML ?

Un autre format de données texte est YAML ( Yet Another Markup Language ; plus tard, YAML Ain't Markup Language ). Il est utilisé pour sérialiser des objets à transmettre sur le réseau (tout comme XML et JSON sont utilisés de cette façon). Parce qu'il est lisible par l'homme, il est également utilisé pour écrire des fichiers de configuration, par exemple, pour Docker, Kubernetes, Ansible, etc. Lorsque YAML doit être enregistré dans un fichier (par exemple, un fichier de configuration), nous utilisons l'un des deux extensions : .yaml ou .yml.

Syntaxe du langage

En XML, les crochets angulaires ( <> ) sont utilisés pour désigner les balises. En JSON, nous utilisons des accolades ( {} ). YAML utilise de nouvelles lignes et une indentation.

Les données sont stockées sous forme de paires clé-valeur, où la clé est une chaîne et la valeur peut être de différents types de données (chaîne, nombre, vrai/faux, tableau, etc.). Les clés sont écrites sans guillemets.

Voyons comment les informations sont stockées dans YAML :

Taper Java YAML
Entier
int number = 5
numéro 5
Nombre fractionnaire
double number = 4.3
nombre : 4,3
Variable booléenne
boolean valid = false
valide : faux
valide : non
valide : désactivé

* Valeurs booléennes valides : vrai/faux, oui/non, activé/désactivé.

Chaîne
String city = "New York"
ville : New York
ville : « New York »
ville : « New York »

* Les trois options sont équivalentes.

Chaîne avec des caractères spéciaux
String line = "aaa\nbbb"
ligne : "aaa\nbbb"
Commentaire dans le code
// comment
# commentaire
Objet
public class Person {
  String name = "Dennis";
  int age = 32;
}

* La classe de l'objet est donnée afin que vous puissiez voir la structure de l'objet.

personne :
  nom : "Dennis"
  âge : 32

* Faites attention à l'indentation avant les attributs. Il doit être le même pour tous les attributs.

Liste de valeurs simples
var ages =
    List.of(1, 3, 5, 9, 78, -5);
âges : [1, 3,5,9,78, -5]
âges :
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* Les deux options sont équivalentes.
** Chaque élément de la liste est marqué d'un trait d'union.

Liste des objets
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)      );
personnes :
  - nom : « Ian »
    âge : 21 ans
  - nom : « Marina »
    âge : 25 ans
  - nom : « Owen »
    âge : 73 ans

Comme en Java, un élément d'une liste peut être une liste, c'est-à-dire que les objets peuvent être imbriqués les uns dans les autres. Le trait d'union qui indique l'élément suivant de la liste peut être décalé horizontalement par rapport à la clé parente ou situé directement en dessous de celle-ci. L'essentiel est que tous les éléments aient le même format. Cela aidera à éviter la confusion et une hiérarchie d'imbrication ambiguë.

âges :
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
âges :
- 1
- 3
- 5
- 9
- 78
- -5

Il existe deux nuances supplémentaires lorsque vous travaillez avec des valeurs de texte :

  1. Texte multiligne. Nous pouvons enregistrer du texte comme ceci :

    multilineText : "ligne 1\nligne 2\n....ligne n"

    Mais il serait très désagréable d'essayer de lire cela. Il y a donc le | (tuyau), que vous pouvez utiliser pour écrire le texte différemment :

    texte multiligne : |
     ligne 1
     ligne 2
     ....
     ligne n

    Vous conviendrez que la seconde option est plus pratique, non ?

  2. Longues files d'attente. Si vous souhaitez conserver le texte sur une seule ligne, mais souhaitez également qu'il tienne dans l'espace de travail visible de l'EDI, vous pouvez utiliser le symbole > (supérieur à).

    singlelineText : >
     début
     ...
     continuer sur la même ligne
     ...
     fin

    Tout le texte sera traité comme une seule ligne.

Si vous devez écrire plusieurs structures de données YAML dans un seul fichier, vous devez les séparer par --- (trois traits d'union). En pratique, cela est rarement nécessaire, mais il est préférable d'être conscient de cette possibilité.

Exemple de document YAML

Créons une structure de données Java (une classe) et un objet correspondant, et essayons de représenter l'objet en 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);
}

Représentation valide dans YAML :

---
weddingDate: 2000-12-03
épouse:
 nom: Ann
 age: 37
 isWoman: yes
mari:
 name: Alex
 age: 40
 isWoman: no
children:
 - name: Iris
   age: 12
   isWoman: true
 - name: Olivia
   age: 5
   isWoman: vrai
---