YAML vs JSON: diferenças, exemplos e quando usar cada um

YAML vs JSON, em resumo: ambos são formatos de texto para os mesmos dados (objetos, listas, strings, números, booleanos e null). JSON é estrito, usa chaves e aspas e é o padrão das APIs web. YAML usa indentação, aceita comentários, âncoras e vários documentos por arquivo, e é popular para configuração. YAML 1.2 é quase um superconjunto do JSON.

Experimente grátis: Conversor de YAML para JSON Gratuito e sem necessidade de conta.

O JSON (JavaScript Object Notation, definido na RFC 8259) foi criado para programas trocarem dados. Então, o que é YAML? O nome significa "YAML Ain't Markup Language", e ele foi criado para pessoas lerem e editarem dados à mão. Este guia mostra os mesmos dados nos dois formatos, compara os dois e explica as armadilhas de cada um. Para ver como qualquer arquivo fica no outro formato, cole-o no conversor de YAML para JSON gratuito ou no conversor de JSON para YAML.

Os mesmos dados em JSON e em YAML

Esta é uma pequena configuração de aplicação em JSON:

{
  "name": "web-app",
  "version": "2.4.1",
  "replicas": 3,
  "debug": false,
  "database": {
    "host": "db.example.com",
    "port": 5432
  },
  "features": ["login", "search"],
  "maintainer": null
}

E os mesmos dados em YAML, com um comentário a mais, algo que o JSON não consegue guardar:

# Settings for the web app
name: web-app
version: 2.4.1
replicas: 3
debug: false
database:
  host: db.example.com
  port: 5432
features:
  - login
  - search
maintainer: null

Os dois resultam exatamente no mesmo objeto após o parsing. O JSON marca a estrutura com {}, [], vírgulas e aspas; o YAML a marca com indentação, pares key: value e - para os itens de lista. A maioria das strings em YAML dispensa aspas, e é por isso que ele se parece mais com um arquivo de configurações do que com código.

YAML vs JSON: principais diferenças

JSON YAML
Estrutura Chaves, colchetes e vírgulas Indentação (somente espaços)
Comentários Não permitidos # comment
Strings Sempre entre aspas duplas Geralmente sem aspas; aspas 'single' ou "double" quando necessário
Tipos de dados Objeto, array, string, número, booleano, null Os mesmos, mais tags opcionais, timestamps em alguns schemas e tipos personalizados
Reutilização Nenhuma Âncoras &, aliases * e merge keys <<
Vários documentos por arquivo Não (um valor por arquivo) Sim, separados por ---
Texto multilinha Só com escapes \n Escalares de bloco | e >
Parsing Gramática pequena e estrita; embutido nos navegadores e em muitas bibliotecas padrão Gramática maior; geralmente exige uma biblioteca de terceiros
Usos típicos APIs REST, package.json, logs, dados enviados entre programas Manifestos do Kubernetes, workflows do GitHub Actions, Docker Compose, Ansible

Alguns formatos aceitam os dois: descrições OpenAPI podem ser escritas em qualquer um deles, e o kubectl apply lê manifestos JSON além dos YAML. Em geral, o JSON leva vantagem quando programas escrevem e leem os dados; o YAML leva vantagem quando pessoas os mantêm à mão e precisam de comentários.

YAML é um superconjunto de JSON?

Quase. A especificação YAML 1.2 (2009) teve como objetivo tornar o YAML um superconjunto estrito do JSON e, na prática, um parser de YAML 1.2 lê quase qualquer documento JSON e retorna os mesmos dados. Há duas ressalvas:

O contrário não vale: a maior parte do YAML não é JSON válido.

Armadilhas do YAML que você precisa conhecer

O problema da Noruega (Norway problem): NO vira false

No YAML 1.1, as palavras sem aspas yes, no, on e off (em minúsculas, com inicial maiúscula ou em maiúsculas) são booleanos, junto com true e false. Assim, esta lista de códigos de país:

countries:
  - GB
  - NO
  - SE

é carregada como ["GB", false, "SE"] por um parser de YAML 1.1 como o PyYAML. A mesma regra transforma a chave on: de um workflow do GitHub Actions no booleano True quando você carrega o arquivo com o PyYAML. O schema core do YAML 1.2 corrigiu isso: só true e false (também escritos True ou TRUE) são booleanos, então um parser 1.2 mantém NO como string. Como raramente você controla qual parser vai ler o seu arquivo, o hábito mais seguro é colocar esses valores entre aspas: - "NO".

Números que não deveriam ser números

Tabs e espaços significativos

A especificação do YAML proíbe caracteres de tab na indentação, então um tab no início de uma linha é um erro de sintaxe, e não uma questão de estilo. A indentação também tem significado: mover uma chave dois espaços para a esquerda a leva para outro objeto pai, e o arquivo pode continuar perfeitamente válido enquanto passa a significar outra coisa.

Strings multilinha: | e >

Um bloco literal (|) mantém as quebras de linha; um bloco dobrado (>) junta as linhas com espaços:

literal: |
  Line one
  Line two
folded: >
  This long sentence is
  folded into one line.

literal vira "Line one\nLine two\n" e folded vira "This long sentence is folded into one line.\n". Os dois mantêm uma quebra de linha final; escreva |- ou >- para removê-la.

Âncoras, aliases e merge keys

O YAML permite definir um bloco uma vez e reutilizá-lo:

defaults: &defaults
  adapter: postgres
  port: 5432
production:
  <<: *defaults
  host: db.example.com

&defaults dá nome ao bloco, *defaults faz referência a ele e << mescla as suas chaves, então production acaba com adapter, port e host. O JSON não tem equivalente: ao converter para JSON, os valores são copiados para cada lugar onde são usados. As merge keys vêm do YAML 1.1 e não fazem parte do schema core do 1.2, mas a maioria dos parsers mais usados ainda as suporta.

Armadilhas do JSON que você precisa conhecer

O JSON é estrito, e três regras causam a maioria dos erros:

Por isso, este arquivo falha com JSON.parse:

{
  // port for local development
  'port': 8080,
  "tags": ["api", "v2",],
}

Para arquivos escritos à mão, existem variantes mais flexíveis: o JSONC ("JSON with comments") é usado nas configurações do VS Code e no tsconfig.json, e o JSON5 também permite aspas simples, chaves sem aspas e vírgulas finais. Nenhum dos dois é aceito por um parser JSON padrão. O formatador JSON aceita entrada em JSON5, marca-a como "JSON5 válido — convertido para JSON estrito" e devolve JSON padrão.

.yaml vs .yml

YAML vs YML não é uma questão de formato: as duas extensões indicam o mesmo formato, e os parsers não se importam com qual você usa. A RFC 9512, que registrou o media type application/yaml em 2024, define .yaml como a extensão preferida e observa que .yml ainda é usada. O FAQ do projeto YAML também recomendava .yaml, e o Docker Compose procura compose.yaml antes de compose.yml. O GitHub Actions aceita as duas em .github/workflows. Escolha uma por projeto e não mantenha config.yaml e config.yml lado a lado.

Segurança: carregue YAML não confiável com segurança

Loaders YAML completos podem construir objetos específicos da linguagem a partir de tags. Em Python, yaml.load(data, Loader=yaml.UnsafeLoader) pode criar objetos Python arbitrários e, com um arquivo malicioso, executar código. Use sempre yaml.safe_load() para arquivos que você não escreveu; ele só constrói dicts, listas, strings, números, booleanos e null simples. Desde o PyYAML 6.0, yaml.load() se recusa a rodar sem um Loader explícito. Tome cuidado também com aliases profundamente aninhados (arquivos "billion laughs") que se expandem em estruturas enormes. O JSON não tem tags nem aliases, então JSON.parse e o json.loads do Python sempre retornam apenas dados simples.

Conversão entre YAML e JSON

Os dois conversores rodam inteiramente no seu navegador e usam a biblioteca open source yaml para JavaScript.

O conversor de YAML para JSON faz o parsing de YAML 1.2, expande âncoras e aliases, aplica merge keys << e transforma um arquivo com vários documentos --- em um array JSON. Você pode escolher 2, 3 (o padrão) ou 4 espaços, tabs ou saída minificada, ordenar as chaves em ordem alfabética e baixar o resultado como converted.json. Erros de sintaxe, como um tab usado na indentação, são exibidos com a linha e a coluna. Os comentários se perdem, porque o JSON não consegue armazená-los.

O conversor de JSON para YAML lê JSON padrão e JSON5, então comentários e vírgulas finais na entrada são aceitos, mas não são levados para a saída. Ele gera YAML com indentação de dois espaços e não tem opções. A saída segue o YAML 1.2: strings como "0755" e "true" ficam entre aspas, mas NO, yes ou on ficam sem aspas, porque no 1.2 são strings comuns. Se uma ferramenta de YAML 1.1 como o PyYAML for ler o arquivo, adicione você mesmo as aspas a esses valores.

Na linha de comando, o yq de Mike Farah converte nas duas direções, e o jq valida e formata JSON:

yq -o json config.yaml
yq -P -oy config.json
jq . config.json

Quando usar YAML e quando usar JSON

A escolha entre JSON vs YAML geralmente depende de quem escreve o arquivo:

Se escolher YAML, mantenha tudo sem surpresas: indentação de dois espaços, aspas em tudo o que possa ser lido como booleano ou número e um linter como o yamllint no CI.

Perguntas frequentes

YAML é melhor que JSON?

Nenhum dos dois é melhor em geral. O JSON é mais simples e mais estrito, o que o torna a escolha mais segura para dados trocados entre programas. O YAML é mais fácil de ler e editar para pessoas e aceita comentários, e é por isso que tantos arquivos de configuração o usam.

Posso usar JSON dentro de um arquivo YAML?

Sim. O flow style do YAML usa os mesmos colchetes e chaves do JSON, então ports: [80, 443] ou db: {"host": "localhost"} funcionam dentro de um arquivo YAML, e um parser de YAML 1.2 aceita quase qualquer documento JSON completo. Chaves duplicadas são a principal exceção.

JSON pode ter comentários?

Não no JSON padrão: a RFC 8259 não tem sintaxe de comentários, e JSON.parse falha com // ou /* */. Algumas ferramentas aceitam JSONC ou JSON5, que permitem comentários, mas você precisa removê-los antes de passar o arquivo para um parser estrito.

Qual é a diferença entre YAML e YML?

No conteúdo, nenhuma: .yaml e .yml são duas extensões de arquivo para o mesmo formato. A RFC 9512 indica .yaml como a preferida, mas os parsers de YAML não se importam com a extensão.

Por que o YAML transforma NO ou on em false ou true?

Porque o YAML 1.1 trata yes, no, on e off como booleanos. O YAML 1.2 só trata true e false como booleanos, mas muitos parsers, incluindo o PyYAML, ainda usam as regras do 1.1. Coloque esses valores entre aspas, por exemplo country: "NO", e todo parser vai lê-los como strings.

Experimente grátis: Conversor de YAML para JSON Gratuito e sem necessidade de conta.