Skip to content

Guia

Converter YAML para JSON em código

Quando a conversão pertence a um script ou a um passo de build e não a um separador do navegador, estes são os equivalentes.

Por yamltojsonfree · Publicado em · Atualizado em

Python, Node.js, Go e a linha de comandos

Cada excerto lê input.yaml e imprime JSON formatado. Não são intercambiáveis, no entanto — a nota por baixo de cada um diz que versão de YAML essa biblioteca implementa, e essa diferença pode mudar os seus dados em silêncio.

Python

import json, yaml

with open("input.yaml") as f:
    data = yaml.safe_load(f)          # safe_load, never load()

print(json.dumps(data, indent=2))

O PyYAML implementa YAML 1.1, por isso aqui no torna-se False — ao contrário da ferramenta do navegador, que usa 1.2 por defeito.

Node.js

import { readFileSync } from "node:fs";
import { load } from "js-yaml";

const data = load(readFileSync("input.yaml", "utf8"));
console.log(JSON.stringify(data, null, 2));

O js-yaml v5 usa YAML 1.2 por defeito — o mesmo motor e as mesmas predefinições da ferramenta deste site.

Go

import (
    "encoding/json"
    "os"
    "sigs.k8s.io/yaml"
)

in, _ := os.ReadFile("input.yaml")
out, _ := yaml.YAMLToJSON(in)
os.Stdout.Write(out)

O sigs.k8s.io/yaml converte através de tags JSON, que é o que o próprio Kubernetes usa.

Bash (yq)

# Single document
yq -o=json input.yaml

# Multi-document into a JSON array
yq -o=json -I=2 'select(document_index >= 0)' -N input.yaml

# Minified
yq -o=json -I=0 input.yaml

Este é o mikefarah/yq. O outro yq (kislyuk) é um wrapper do jq com opções diferentes.

Três coisas a acertar num script

Use o loader seguro. Em Python, yaml.load() sem um loader explícito pode construir objetos Python arbitrários a partir de YAML com tags — o que é execução de código se a entrada não for sua. safe_load() analisa apenas dados simples, e quase nunca há razão para usar outra coisa.

Conheça a sua versão de YAML. O PyYAML lê YAML 1.1, por isso country: NO sai como False; o js-yaml v5 e o parser Go ao estilo Kubernetes leem 1.2, por isso a mesma linha continua a ser uma string. Um pipeline que converte com uma biblioteca e valida com outra pode contradizer-se a si próprio. A lista completa de valores afetados está no guia YAML 1.1 vs 1.2.

Trate os fluxos multi-documento. A saída do Kubernetes e do Helm é normalmente vários documentos separados por ---. Um load simples lê só o primeiro e descarta o resto em silêncio — use yaml.safe_load_all() em Python, loadAll() em js-yaml, ou a invocação do yq mostrada acima para obter todos os documentos.

Ou salte o script por completo

Para uma conversão pontual, o conversor gratuito de YAML para JSON faz tudo o que está acima no navegador: fluxos multi-documento, anchors e merge keys, modos YAML 1.1 e 1.2, e erros fixados à linha exata. Nada é enviado — o parser corre inteiramente na sua máquina.

Referências