¿Para qué se usa YAML?

Otro formato de datos de texto es YAML ( Y Yet Another Markup Language ; más tarde, YAML Ain't Markup Language ). Se utiliza para serializar objetos para su transmisión a través de la red (al igual que XML y JSON se utilizan de esta manera). Debido a que es legible por humanos, también se usa para escribir archivos de configuración, por ejemplo, para Docker, Kubernetes, Ansible, etc. Cuando es necesario guardar YAML en un archivo (por ejemplo, un archivo de configuración), usamos uno de dos extensiones: .yaml o .yml.

Sintaxis del lenguaje

En XML, los corchetes angulares ( <> ) se utilizan para designar etiquetas. En JSON, usamos corchetes ( {} ). YAML usa nuevas líneas y sangría.

Los datos se almacenan como pares clave-valor, donde la clave es una cadena y el valor puede ser de varios tipos de datos (cadena, número, verdadero/falso, matriz, etc.). Las claves se escriben sin comillas.

Echemos un vistazo a cómo se almacena la información en YAML:

Tipo Java YAML
Entero

int number = 5
número 5
Numero fraccional

double number = 4.3
número: 4.3
variable booleana

boolean valid = false
válido: falso
válido: no
válido: desactivado

* Valores booleanos válidos: verdadero/falso, sí/no, activado/desactivado.

Cadena

String city = "New York"
ciudad: Nueva York
ciudad: 'Nueva York'
ciudad: "Nueva York"

* Las tres opciones son equivalentes.

Cadena con caracteres especiales

String line = "aaa\nbbb"
línea: "aaa\nbbb"
Comentar en código

// comment
# comentario
Objeto

public class Person {
  String name = "Dennis";
  int age = 32;
}

* La clase del objeto se proporciona para que pueda ver la estructura del objeto.

persona:
  nombre: "Dennis"
  edad: 32

* Preste atención a la sangría antes de los atributos. Debe ser el mismo para todos los atributos.

Lista de valores simples

var ages = 
    List.of(1, 3, 5, 9, 78, -5);
edades: [1, 3,5,9,78, -5]
edades:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* Ambas opciones son equivalentes.
** Cada elemento de la lista está marcado con un guión.

Lista de objetos

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)      );
personas:
  - nombre: "Ian"
    edad: 21
  - nombre: "Marina"
    edad: 25
  - nombre: "Owen"
    edad: 73

Como en Java, un elemento de una lista puede ser una lista, es decir, los objetos se pueden anidar unos dentro de otros. El guión que indica el siguiente elemento de la lista se puede desplazar horizontalmente en relación con la clave principal o ubicarse directamente debajo de ella. Lo principal es que todos los elementos tienen el mismo formato. Esto ayudará a evitar confusiones y una jerarquía de anidamiento ambigua.

edades:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
edades:
- 1
- 3
- 5
- 9
- 78
- -5

Hay dos matices más cuando se trabaja con valores de texto:

  1. Texto de varias líneas. Podemos guardar texto como este:

    multilineText: "línea 1\nlínea 2\n....línea n"

    Pero sería muy desagradable tratar de leer eso. Así que está el | (tubería), que puede usar para escribir el texto de manera diferente:

    multilineText: |
     línea 1
     línea 2
     ....
     línea n

    Estarás de acuerdo en que la segunda opción es más conveniente, ¿verdad?

  2. Líneas largas. Si desea mantener el texto en una línea pero también desea que quepa en el espacio de trabajo visible del IDE, puede usar el símbolo > (mayor que).

    singlelineText: >
     comenzar
     ...
     continuar con la misma línea
     ...
     terminar

    Todo el texto será tratado como una sola línea.

Si necesita escribir varias estructuras de datos YAML en un archivo, debe separarlas con --- (tres guiones). En la práctica, rara vez es necesario, pero es mejor estar al tanto de esta posibilidad.

Ejemplo de un documento YAML

Vamos a crear una estructura de datos Java (una clase) y un objeto correspondiente, e intentar representar el objeto como 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);
}

Representación válida en YAML:

---
fecha de la boda: 2000-12-03
esposa:
 nombre: Ann
 edad: 37
 es mujer: sí
esposo:
 nombre: Alex
 edad: 40
 es mujer: sin
hijos:
 - nombre: Iris
   edad: 12
   es mujer: verdadero
 - nombre: Olivia
   edad: 5
   esMujer: cierto
---