JSON e YAML: os mesmos dados, dois estilos
JSON e YAML descrevem as mesmas coisas: objetos (chamados de mapeamentos no YAML), listas, strings, números, booleanos e null. O JSON usa chaves, colchetes, aspas e vírgulas. O YAML usa recuo e hifens, o que o deixa mais curto e mais fácil de ler e editar à mão. É por isso que ferramentas como Kubernetes, Docker Compose, GitHub Actions e Ansible usam YAML na configuração, enquanto as APIs normalmente falam JSON.
Muitas vezes é preciso passar de um para o outro. Uma API devolve JSON e você quer o conteúdo em um arquivo de configuração. Ou uma configuração em YAML precisa ser enviada para um programa que só lê JSON. Este conversor faz os dois.
Como usar
- Escolha um sentido com o botão JSON para YAML ou YAML para JSON.
- Cole seus dados na caixa da esquerda, clique em Abrir arquivo ou em Exemplo. O resultado aparece à direita enquanto você digita.
- Escolha um Recuo de 2 ou 4 espaços. No sentido de YAML para JSON também há a opção Minificado.
- De JSON para YAML, ligue Ordenar chaves de A a Z para colocar as chaves em ordem alfabética.
- Clique em Copiar, ou em Baixar para salvar um arquivo
.yamlou.json.
Quando você troca de sentido, o resultado atual vai para a entrada, para você converter de um lado para o outro e conferir a ida e a volta.
Exemplo de JSON para YAML
{"name":"web-app","version":3,"private":true,"ports":[80,443],"database":{"host":"localhost","password":null},"tags":["api","v2"]}
vira:
name: web-app
version: 3
private: true
ports:
- 80
- 443
database:
host: localhost
password: null
tags:
- api
- v2
Aspas seguras
Algumas strings parecem outros tipos para um parser de YAML. O conversor coloca essas strings entre aspas para que continuem sendo strings. Este JSON:
{"zip":"02134","enabled":"yes","version":"1.10","note":"a: b","empty":""}
vira:
zip: "02134"
enabled: "yes"
version: "1.10"
note: "a: b"
empty: ""
Sem as aspas, 02134 perderia o zero à esquerda, 1.10 viraria o número 1.1, e um parser antigo de YAML 1.1 (o PyYAML e muitas ferramentas de CI usam essas regras) leria yes como true. O conversor segue as regras de aspas mais rigorosas, para que o resultado seja lido da mesma forma por parsers antigos e novos. Datas como "2024-01-15" ficam entre aspas pelo mesmo motivo. Textos em português, com acentos e cedilha, não precisam de aspas e saem como estão.
Exemplo de YAML para JSON
# Configurações do app
name: web-app
ports:
- 80
- 443
debug: false
retries: 3
owner: ~
vira:
{
"name": "web-app",
"ports": [
80,
443
],
"debug": false,
"retries": 3,
"owner": null
}
O comentário sumiu, porque o JSON não tem comentários, e ~ é a abreviação do YAML para null.
As merge keys são resolvidas. Este arquivo no estilo do Rails:
defaults: &defaults
adapter: postgres
host: localhost
development:
<<: *defaults
database: dev_db
dá:
{
"defaults": {
"adapter": "postgres",
"host": "localhost"
},
"development": {
"adapter": "postgres",
"host": "localhost",
"database": "dev_db"
}
}
Dois documentos separados por --- (por exemplo, kind: Service e kind: Deployment) viram um único array. Com a opção Minificado, fica [{"kind":"Service"},{"kind":"Deployment"}].
Como os valores são lidos
A conversão de YAML para JSON usa as regras do YAML 1.2. Por essas regras, yes, no e on são strings comuns, só true e false são booleanos, e as datas continuam strings. Esta entrada:
a: yes
b: no
c: on
d: true
e: 010
f: 0o10
g: 1e3
h: 2024-01-15
é convertida (minificada) para:
{"a":"yes","b":"no","c":"on","d":true,"e":10,"f":8,"g":1000,"h":"2024-01-15"}
Repare que 010 é lido como dez, e 0o10 é o octal de oito.
Se um valor precisa continuar como texto, coloque-o entre aspas no YAML.
Dicas para uma ida e volta limpa
- Converter JSON para YAML e de volta dá os mesmos dados, mas nem sempre o mesmo texto. A ordem das chaves é mantida, a não ser que você ligue Ordenar chaves de A a Z.
- Comentários, âncoras e tags personalizadas do YAML não têm equivalente no JSON. As âncoras são expandidas em cópias completas dos dados.
- Inteiros muito grandes, como IDs de 20 dígitos, ficam exatos de JSON para YAML quando o navegador permite. De YAML para JSON eles passam pelos números do JavaScript, então guarde IDs longos como strings entre aspas.
- Seus arquivos ficam no seu aparelho. Nada é enviado.
Erros
Os erros são apontados com a linha e a coluna, e Mostrar na entrada leva até eles. Uma vírgula sobrando no JSON dá Linha 3, coluna 1: Vírgula final antes de "}" não é permitida. No YAML, uma chave repetida dá Linha 2, coluna 1: Map keys must be unique, e as tabulações usadas no recuo são recusadas, porque o YAML só aceita espaços. As mensagens do JSON vêm em português; as do YAML vêm da biblioteca de YAML e continuam em inglês, só com a linha e a coluna em português.
Outras formas de converter
yq. A versão em Go do yq converte na linha de comando: ele lê JSON como entrada, porque JSON é YAML válido, e consegue escrever qualquer um dos dois formatos.
Python. Com o pacote PyYAML, yaml.safe_dump(json.load(f)) escreve YAML a partir de um arquivo JSON. O PyYAML segue o YAML 1.1, então confira strings como yes e no. Acrescente allow_unicode=True para que os acentos não virem escapes.
VS Code. Várias extensões acrescentam comandos para converter uma seleção entre JSON e YAML.
Ferramentas relacionadas
Para organizar um arquivo YAML sem convertê-lo, use o formatador YAML. Para conferir ou formatar o JSON antes, use o formatador JSON. Para dados de planilha, comece pela ferramenta de converter CSV para JSON.