Ferramentas / Validador de YAML simples

Validador de YAML simples

Cole um YAML e veja na hora se ele está correto, com a linha do erro de indentação. Cobre um subconjunto do YAML usado em configurações.


  
  

Processamento local: nada do que você digita sai do seu navegador.

Como usar

Cole o YAML na caixa. A cada tecla ele é interpretado e, se estiver correto, mostramos o resultado convertido em JSON, o que ajuda a conferir o que o YAML realmente representa. Se houver erro, apontamos a linha e a coluna e mostramos o trecho com um marcador.

O que é suportado

  • Mapas (chave: valor) e listas (- item), aninhados por indentação com espaços.
  • Valores: texto, números, true/false, null ou ~, e texto entre aspas simples ou duplas.
  • Listas e mapas em linha: [a, b] e {k: v}.
  • Blocos de texto com | e >, e comentários com #.

Limitações

É um subconjunto do YAML 1.2. Não são suportados âncoras e aliases (&, *), tags (!!), vários documentos no mesmo arquivo, chaves complexas e a mescla <<. Mostramos apenas o primeiro erro encontrado. Em YAML a indentação precisa ser feita só com espaços, nunca com tabulação, e é a causa mais comum de erro.

Como implementar em código

Exemplos prontos para usar no seu projeto.

// npm install js-yaml
import yaml from 'js-yaml';

const texto = `
servico: api
portas:
  - 80
  - 443
 erro: indentação torta
`;

try {
  const dados = yaml.load(texto);
  console.log(dados);
} catch (e) {
  // e.mark.line começa em 0
  console.log(`erro na linha ${e.mark.line + 1}, coluna ${e.mark.column + 1}: ${e.reason}`);
}
# pip install pyyaml
import yaml

texto = """
servico: api
portas:
  - 80
  - 443
 erro: indentação torta
"""

try:
    dados = yaml.safe_load(texto)     # safe_load não executa código arbitrário
    print(dados)
except yaml.YAMLError as e:
    mark = getattr(e, "problem_mark", None)
    if mark:
        print(f"erro na linha {mark.line + 1}, coluna {mark.column + 1}: {e.problem}")
    else:
        print(e)
package main

// go get gopkg.in/yaml.v3
import (
	"fmt"

	"gopkg.in/yaml.v3"
)

func main() {
	texto := "servico: api\nportas:\n  - 80\n  - 443\n erro: indentação torta\n"

	var dados map[string]any
	if err := yaml.Unmarshal([]byte(texto), &dados); err != nil {
		fmt.Println("erro:", err) // ex.: yaml: line 5: mapping values are not allowed in this context
		return
	}
	fmt.Println(dados)
}
// pubspec.yaml: dependencies: yaml: ^3.1.0
import 'package:yaml/yaml.dart';

void main() {
  const texto = 'servico: api\nportas:\n  - 80\n  - 443\n erro: indentação torta\n';

  try {
    final dados = loadYaml(texto);
    print(dados);
  } on YamlException catch (e) {
    final linha = e.span?.start.line;          // começa em 0
    print('erro na linha ${linha == null ? "?" : linha + 1}: ${e.message}');
  }
}
// Maven: org.yaml:snakeyaml
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.error.MarkedYAMLException;

public class YamlCheck {
    public static void main(String[] args) {
        String texto = "servico: api\nportas:\n  - 80\n  - 443\n erro: indentação torta\n";
        try {
            Object dados = new Yaml().load(texto);
            System.out.println(dados);
        } catch (MarkedYAMLException e) {
            var m = e.getProblemMark();             // linha e coluna começam em 0
            System.out.println("erro na linha " + (m.getLine() + 1) + ", coluna " + (m.getColumn() + 1)
                    + ": " + e.getProblem());
        }
    }
}
<?php
// composer require symfony/yaml
require 'vendor/autoload.php';

use Symfony\Component\Yaml\Yaml;
use Symfony\Component\Yaml\Exception\ParseException;

$texto = "servico: api\nportas:\n  - 80\n  - 443\n erro: indentação torta\n";

try {
    $dados = Yaml::parse($texto);
    print_r($dados);
} catch (ParseException $e) {
    echo 'erro na linha ', $e->getParsedLine(), ': ', $e->getMessage(), PHP_EOL;
}
// dotnet add package YamlDotNet
using System;
using YamlDotNet.Core;
using YamlDotNet.Serialization;

class Program
{
    static void Main()
    {
        var texto = "servico: api\nportas:\n  - 80\n  - 443\n erro: indentação torta\n";
        try
        {
            var dados = new DeserializerBuilder().Build().Deserialize<object>(texto);
            Console.WriteLine("YAML válido");
        }
        catch (YamlException e)
        {
            Console.WriteLine($"erro na linha {e.Start.Line}, coluna {e.Start.Column}: {e.Message}");
        }
    }
}

Perguntas frequentes

Por que a tabulação é erro em YAML?

A especificação proíbe tabs na indentação, pois a estrutura do documento depende da quantidade exata de espaços. Configure o editor para inserir espaços ao apertar Tab.

Esta ferramenta aceita todo YAML válido?

Não. Ela aceita apenas o subconjunto descrito acima. Um YAML válido com âncoras, tags ou vários documentos será apontado como não suportado, mesmo que outro parser o aceite.

Por que yes, no e on não viram booleano?

No YAML 1.2 só true e false são booleanos. Os valores yes, no, on e off eram booleanos no YAML 1.1 e aqui são tratados como texto.

Veja também

Precisa de um sistema ou app sob medida?

A VcInova desenvolve software, aplicativos e integrações para empresas de todo o Brasil.

Fale com a VcInova