Para que serve o YAML?

Outro formato de dados de texto é YAML ( Yet Another Markup Language ; mais tarde, YAML Ain't Markup Language ). Ele é usado para serializar objetos para transmissão pela rede (assim como XML e JSON são usados ​​dessa forma). Por ser legível por humanos, também é usado para escrever arquivos de configuração, por exemplo, para Docker, Kubernetes, Ansible, etc. Quando o YAML precisa ser salvo em um arquivo (por exemplo, um arquivo de configuração), usamos um dos dois extensões: .yaml ou .yml.

Sintaxe da linguagem

Em XML, os colchetes angulares ( <> ) são usados ​​para designar tags. Em JSON, usamos colchetes ( {} ). YAML usa novas linhas e recuo.

Os dados são armazenados como pares chave-valor, onde a chave é uma string e o valor pode ser vários tipos de dados (string, número, verdadeiro/falso, array, etc.). As chaves são escritas sem aspas.

Vamos dar uma olhada em como as informações são armazenadas em YAML:

Tipo Java YAML
inteiro
int number = 5
número 5
número fracionário
double number = 4.3
número: 4,3
variável booleana
boolean valid = false
válido: falso
válido: não
válido: desativado

* Valores booleanos válidos: verdadeiro/falso, sim/não, ativado/desativado.

Corda
String city = "New York"
cidade: Nova York
cidade: 'Nova York'
cidade: "Nova York"

* Todas as três opções são equivalentes.

String com caracteres especiais
String line = "aaa\nbbb"
linha: "aaa\nbbb"
Comentar no código
// comment
# Comente
Objeto
public class Person {
  String name = "Dennis";
  int age = 32;
}

* A classe do objeto é fornecida para que você possa ver a estrutura do objeto.

pessoa:
  nome: "Dennis"
  idade: 32

* Preste atenção ao recuo antes dos atributos. Deve ser o mesmo para todos os atributos.

Lista de valores simples
var ages =
    List.of(1, 3, 5, 9, 78, -5);
idades: [1, 3,5,9,78, -5]
idades:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* Ambas as opções são equivalentes.
** Cada elemento da lista é marcado com um hífen.

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)      );
pessoas:
  - nome: "Ian"
    idade: 21
  - nome: "Marina"
    idade: 25
  - nome: "Owen"
    idade: 73

Como em Java, um elemento de uma lista pode ser uma lista, ou seja, objetos podem ser aninhados uns dentro dos outros. O hífen que indica o próximo elemento da lista pode ser deslocado horizontalmente em relação à chave pai ou localizado diretamente abaixo dela. O principal é que todos os elementos tenham o mesmo formato. Isso ajudará a evitar confusão e uma hierarquia de aninhamento ambígua.

idades:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
idades:
- 1
- 3
- 5
- 9
- 78
- -5

Existem mais duas nuances ao trabalhar com valores de texto:

  1. Texto multilinha. Podemos salvar o texto assim:

    multilineText: "linha 1\nlinha 2\n....linha n"

    Mas seria muito desagradável tentar ler isso. Portanto, há o | (pipe) símbolo, que você pode usar para escrever o texto de forma diferente:

    multilinhaTexto: |
     linha 1
     linha 2
     ....
     linha n

    Você concorda que a segunda opção é mais conveniente, certo?

  2. Longas filas. Se você deseja manter o texto em uma linha, mas também deseja que ele caiba na área de trabalho visível do IDE, pode usar o símbolo > (maior que).

    singlelineText: >
     início
     ...
     continua mesma linha
     ...
     fim

    Todo o texto será tratado como uma linha.

Se você precisar gravar várias estruturas de dados YAML em um arquivo, será necessário separá-las com --- (três hífens). Na prática, raramente há necessidade disso, mas é melhor estar ciente dessa possibilidade.

Exemplo de um documento YAML

Vamos criar alguma estrutura de dados Java (uma classe) e um objeto correspondente e tentar representar o 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);
}

Representação válida em YAML:

---
data do casamento: 2000-12-03
esposa:
 nome: Ann
 idade: 37
 isWoman: sim
marido:
 nome: Alex
 idade: 40
 isWoman: sem
filhos:
 - nome: Iris
   age: 12
   isWoman: verdadeiro
 - nome: Olivia
   idade: 5
   éMulher: verdadeiro
---