Noções básicas de YAML
YAML é um formato de dados escopado por indentação, padronizado como YAML 1.2, feito para arquivos de configuração que humanos escrevem e programas leem. O aninhamento vem de espaços em vez de chaves, escalares sem aspas ganham tipo por inferência e comentários começam com #. Essas três conveniências causam quase todo bug real de YAML, então este guia ensina regras e pegadinhas juntas.
Noções básicas de YAML: explicação
YAML é o formato em que a configuração chega. Manifests do Kubernetes, workflows do GitHub Actions, arquivos docker-compose e playbooks do Ansible são todos YAML: mapas aninhados escritos com espaços, listas escritas com hífens, quase nenhum colchete à vista. O nome originalmente significava Yet Another Markup Language; os autores passaram a apresentá-lo como YAML Ain't Markup Language — a leitura mais precisa, já que ele descreve dados, não documentos.
O padrão atual é o YAML 1.2 (2009), e sua mudança mais importante é discreta: o 1.1 tipava as palavras sem aspas yes, no, on e off como booleanos, e o 1.2 não. A maioria dos softwares ainda carrega as regras do 1.1 por padrão, então a mesma linha de texto pode significar coisas diferentes em ferramentas diferentes. O YAML 1.2 também tornou quase todos os documentos JSON YAML válidos — a forma mais limpa de resumir a gramática em uma frase.
Este guia cobre o que um iniciante precisa — regras de indentação, tipagem de escalares, aspas, escalares de bloco, âncoras e comentários — e termina com uma lista exata do que os conversores deste site aceitam e recusam. Tudo roda no seu navegador, nada é enviado, então os exemplos podem ser colados e testados com segurança.
Como o YAML 1.2 trata a maioria dos documentos JSON como YAML válido, qualquer configuração que você consiga simplificar até as chaves ganha ferramentas instantâneas: cole-a no o Formatador de JSON e ele vai formatar, validar e informar a linha e a coluna exatas de cada erro de sintaxe.
Quando um arquivo novo poderia honestamente seguir qualquer um dos dois caminhos, a comparação entre JSON e YAML reúne os trade-offs em uma única tabela de decisão e diz qual formato cada tipo de documento prefere.
A indentação é a sintaxe
No YAML, o espaço em branco não é decoração — é a estrutura inteira. Um mapeamento é uma chave, dois-pontos, um espaço e, então, um valor; um valor aninhado é escrito na linha seguinte, mais indentado, e duas linhas na mesma indentação são irmãs. Tabs são proibidos de plano: a especificação não consegue decidir a largura de um tab, então os parsers os rejeitam em vez de adivinhar. Editores continuam inserindo tabs ao copiar e colar, e é por isso que tantos arquivos parecem perfeitos e se recusam a fazer parse.
A convenção é dois espaços por nível. Quatro ou seis são igualmente válidos — a especificação só proíbe tabs —, mas dois é o que o Kubernetes e o Compose usam, o que todo linter espera e o que impede manifests profundos de rolar para o lado. Misturar larguras dentro de um arquivo é assim que nascem os erros de indentação, então escolha dois e deixe o editor garantir isso.
- Um nível = qualquer contagem fixa de espaços; dois é a convenção.
- Tabs na indentação são rejeitados pelos parsers, não convertidos.
- Um item de sequência pode ficar na indentação da chave-pai — o hífen é o marcador.
- Valores também podem ser escritos inline no estilo de fluxo: ports: [8080].
Um mapeamento aninhado com uma sequência
services:
web:
image: nginx:1.27
ports:
- "8080:80"
cache:
image: redis:7A árvore que um parser constrói
services ├─ web │ ├─ image: "nginx:1.27" │ └─ ports: ["8080:80"] └─ cache └─ image: "redis:7"
Escalares e o problema da Noruega
Valores entre aspas são strings, sempre. Valores sem aspas ganham tipo por inferência, e a inferência é de onde vem a reputação do YAML: um 8080 sem aspas se torna o número 8080 e um valor vazio se torna null, o que ajuda — até a inferência tipar algo que você queria como texto, como um código de país ou uma string de versão.
A falha clássica é uma lista de códigos de país ISO em que NO — Noruega — faz parse como booleano false: o problema da Noruega, engraçado até desligar silenciosamente uma flag de deploy. A versão 1.1 foi muito mais longe, como a tabela mostra. O core schema do 1.2 resolve apenas true e false como booleanos e lê o restante da tabela abaixo como strings simples ou números decimais — mas, como tanto software em produção ainda aplica regras do 1.1, o hábito defensivo é colocar entre aspas tudo o que precisa permanecer string.
| Você escreveu | O YAML 1.1 interpreta como | O core schema do YAML 1.2 interpreta como |
|---|---|---|
| no | booleano false | a string "no" |
| on / off | booleano true / false | as strings "on" / "off" |
| 12:30 | inteiro 750 (sexagesimal) | a string "12:30" |
| 0640 | inteiro 416 (octal) | inteiro 640 (decimal) |
| 2026-09-19 | um objeto de data | a string "2026-09-19" |
| ~ | null | null |
Aspas e escalares de bloco
O YAML oferece três formas de escrever uma string. Sem aspas é o padrão e funciona para a maioria dos valores. Aspas simples são literais — o único escape é duplicar a aspa ('it''s fine'). Aspas duplas suportam escapes com barra invertida como \n e \t, o estilo que o JSON usa. A regra defensiva continua valendo: se um valor contém qualquer coisa que possa ser confundida com estrutura — dois-pontos, cerquilhas, palavras reservadas —, coloque aspas de propósito.
Texto multilinha usa escalares de bloco. Um bloco literal, escrito |, mantém cada nova linha exatamente como digitada — a forma certa para scripts de shell e certificados. Um bloco dobrado, escrito >, junta as linhas em um parágrafo fluido — a forma certa para uma descrição longa. Ambos aceitam um indicador de chomping: |- remove a última nova linha, |+ mantém todas as finais, e o | simples mantém exatamente uma.
Dois estilos de escalar de bloco
script: | set -e make build make deploy summary: > Deploys finish in under a minute.
O que os escalares se tornam
script: "set -e\nmake build\nmake deploy\n" summary: "Deploys finish in under a minute.\n"
Âncoras, aliases e reutilização
O YAML permite que um nó carregue um nome que outros nós referenciam. Escreva &name depois de uma chave para ancorar seu valor; escreva *name em qualquer outro lugar para criar um alias, e o parser substitui por uma cópia do nó ancorado. Jobs que compartilham uma política de retry apontam, então, para uma única definição, e a mudança é feita uma vez só.
Duas extensões se apoiam nesse mecanismo. Chaves de merge, escritas <<: *name, enxertam todas as chaves de um mapeamento ancorado na atual — comuns em arquivos Compose e Ansible, e uma convenção da era 1.1 que nunca entrou na gramática central do 1.2. Âncoras também podem ser abusadas: aliases aninhados dentro de aliases fazem dez definições se expandirem para um milhão de nós — o ataque billion-laughs —, então parsers confiáveis estabelecem um orçamento de expansão e relatam o limite em vez de travar.
Uma âncora e dois aliases
defaults: &base retries: 3 timeout: 30s staging: retries: 3 timeout: 30s log: *base
O que o consumidor recebe
defaults: { retries: 3, timeout: "30s" }
log alias: { retries: 3, timeout: "30s" } (staging.log)Comentários e múltiplos documentos
Comentários começam com # e vão até o fim da linha; uma cerquilha dentro de uma string entre aspas não conta. Essa é a maior vitória ergonômica do YAML sobre o JSON, que removeu comentários por design, e a razão pela qual a configuração mantida por humanos gravita para cá: o arquivo se explica inline, e as revisões citam uma linha e seu comentário em um único hunk de diff.
Um arquivo também pode conter vários documentos, separados por linhas de três hífens; um --- no começo é o marcador opcional de início e ... encerra um documento. É assim que um único artefato carrega uma configuração de staging e uma de produção lado a lado. Os conversores deste site fazem parse de todos os documentos e operam sobre o último, acompanhando o comportamento comum de CLIs.
Dois documentos, um arquivo
env: staging region: eu-1 --- env: production region: us-2
O que os conversores usam
env: production region: us-2 (the last document)
O que os conversores deste site aceitam
Todo parser de YAML é um parser de um subconjunto — a gramática 1.2 completa é notoriamente grande —, e um conversor conquista confiança ao declarar seu subconjunto em vez de deixar você descobri-lo por falhas. A biblioteca YAML deste site implementa o core schema do 1.2 sobre as construções de bloco e de fluxo que aparecem em arquivos de configuração reais, com limites deliberados onde a especificação permite trabalho ilimitado. A tabela é o contrato.
| Recurso | Status aqui | Comportamento |
|---|---|---|
| Mapeamentos e sequências de bloco | Aceitos | Aninhados a qualquer profundidade, dois espaços ou qualquer indentação consistente |
| Estilo de fluxo [1, 2] e {a: 1} | Aceito | Incluindo documentos JSON inteiros colados como estão |
| Comentários e escalares entre aspas | Aceitos | Ambos os estilos de aspas, todos os estilos de escalar de bloco |
| Tabs na indentação | Recusados | Rejeitados com o número da linha problemática |
| Chaves explícitas (? key) | Recusadas | Sem equivalente em JSON — chaves de JSON devem ser strings |
| Chaves de merge (<<) | Recusadas | Expanda o merge manualmente, ou crie alias dos valores diretamente |
| Diretiva %YAML 1.1 | Avisado | O core schema do 1.2 é aplicado; yes e no permanecem strings |
| Múltiplos documentos | Interpretados | Os conversores operam sobre o último documento |
| Expansão de aliases | Limitado | Correntes de aliases profundas têm um limite e são relatadas, nunca expandidas por completo |
Perguntas frequentes
Meu YAML é enviado quando uso esses conversores?
Não. Todo conversor deste site roda como JavaScript dentro da aba do seu navegador; não há etapa de envio nem backend para receber um. Verifique no DevTools: abra o painel Network, converta um arquivo e veja a lista de requisições permanecer vazia. A Content-Security-Policy do site também bloqueia conexões de saída dos scripts da página.
Por que meu arquivo falha no parse quando parece correto?
Três culpados cobrem a maioria dos casos: um tab escondido na indentação (os parsers recusam tabs de plano), um vício do YAML 1.1, como um no sem aspas ou uma chave de merge que um parser 1.2 não vai adivinhar, ou um escalar sem aspas que a inferência tipou como algo que você não queria. Um bom conversor aponta a linha; o deste site aponta.
YAML é um superconjunto do JSON?
No YAML 1.2, quase sempre sim: um documento JSON com suas chaves e colchetes intactos faz parse como YAML sem alterações. O inverso nunca é verdade. Comentários, âncoras, chaves sem aspas, escalares de bloco multilinha e múltiplos documentos em um arquivo não têm representação em JSON, então converter YAML para JSON é uma porta de mão única para qualquer arquivo que os use.
Como evito o problema da Noruega?
Coloque entre aspas todo escalar cujo tipo importa para você. Um NO sem aspas faz parse como booleano false sob as regras do YAML 1.1, e on, off, yes e no seguem o mesmo caminho; o core schema do 1.2 os mantém como strings, mas muito software em produção ainda carrega o 1.1. Colocar entre aspas códigos de país, feature flags e strings de versão é o hábito de custo zero.
Devo usar âncoras ou simplesmente repetir os valores?
Repita os valores quando as cópias podem divergir; ancore e crie aliases quando eles são genuinamente um único fato definido uma vez. Âncoras mantêm a configuração DRY, mas custam legibilidade local — o leitor precisa saltar até a definição. Chaves de merge são a parte menos portável: muitos parsers, incluindo os conversores deste site, as recusam em vez de adivinhar a ordem do enxerto.
Dois espaços ou quatro espaços para a indentação YAML?
Ambos são válidos — a especificação proíbe tabs, não qualquer contagem de espaços —, então isso é convenção, não correção. Dois espaços venceram: o Kubernetes e o Compose usam, todo linter adota por padrão, e o aninhamento profundo continua legível. O que importa é nunca misturar larguras em um arquivo.
Onde posso ler os padrões citados aqui?
Quais ferramentas relacionadas devo usar a seguir?
- O que é JSONGuia em linguagem simplesAbrir
- JSON vs YAMLComparação lado a ladoAbrir
- Formatar JSONIndenta, ordena chaves e remove comentáriosAbrir
- Sintaxe de expressão cronGuia em linguagem simplesAbrir
- Testar expressão cronVê o que a expressão significa e quando ela disparaAbrir
- Ferramentas de textoCompare, converta e transforme texto simples e código.Abrir