Ferramentas de desenvolvedor · Conversores de sintaxe
Coerção do tipo YAML para JSON: como sim, não e 0777 mudam de significado
· Como funciona
yaml JSON formatos de dados
YAML resolve escalares sem aspas em tipos, e as regras diferem entre YAML 1.1 e 1.2. Esta postagem mostra exatamente como um conversor decide se um valor é booleano, inteiro, flutuante ou string e como controlar o resultado.
O valor que retornou como verdadeiro - um escalar YAML simples destinado a texto, convertido em JSON como um booleano e o serviço que então se comportou mal
Um valor como `NO` pode se tornar falso em um carregador YAML 1.1, mas não é isso que este conversor fornece. Ambas as opções ToolAcre usam esquemas YAML 1.2, então `NO`, `yes`, `no`, `on` e `off` permanecem strings. A abertura corrigida é importante porque um exemplo afirmando que este painel transforma `NO` em verdadeiro ou falso ensinaria o oposto de seu comportamento testado.
Surpresas de tipo ainda existem. No esquema padrão JSON, `null` é nulo enquanto `~`, um valor vazio e `0o755` permanecem strings. Selecionar Core altera esses três formulários para nulo, nulo e 493. A saída é útil precisamente porque expõe o valor JavaScript resolvido, em vez de fingir que todo token YAML simples carrega um tipo óbvio.
O valor que permaneceu no texto em YAML 1.2
A resolução implícita ocorre enquanto js-yaml lê a fonte. O esquema restrito selecionado decide se um escalar simples corresponde a um formato nulo, booleano ou numérico antes do conversor gravar JSON. A citação ignora essa decisão: `"0o755"` é texto em qualquer esquema, e um escalar de bloco permanece uma string incluindo as quebras de linha representadas por seu indicador chomping.
Isso é análise e serialização, não uma substituição de expressão regular. O leitor constrói strings, números, booleanos, nulos, arrays e objetos; `JSON.stringify` então emite esses valores com o recuo selecionado. Os comentários e a ortografia do token já foram eliminados no estágio de escrita, portanto, nenhum serializador pode reconstruir se um número era originalmente decimal ou escrito em outra notação YAML aceita.
As regras YAML 1.1 - sim/no/on/off booleanos, 0777 como octal, 1:30 como sexagesimal e strings de versão como 1.10 lidas como flutuantes
O esboço lista coerções YAML 1.1, como tempo sexagesimal e octal legado. São riscos de compatibilidade relevantes, mas não são modos disponíveis aqui. ToolAcre intencionalmente não oferece um esquema 1.1. Sua IU diz que nenhuma das opções enviadas lê `NO` como falsa e os testes fixam o código do país e as palavras sim, não, ativado e desativado como strings.
Esse limite altera o método de depuração. Se outro aplicativo transformar essas palavras em booleanos, compare a configuração do analisador com ToolAcre em vez de esperar uma saída idêntica. O conversor pode mostrar o que seus próprios dois esquemas produzem; ele não pode certificar o esquema ou a versão usada por um executor de CI, estrutura ou sistema de implantação que posteriormente consome o arquivo.
YAML 1.1 coerções são perigos que este conversor evita
O esquema JSON padrão aceita apenas grafias escalares compatíveis com o modelo de JSON. Core adiciona as familiares formas nulas YAML, números inteiros hexadecimais e octais, Infinity e NaN. O Core ainda permanece dentro de um carregador restrito: tags de objetos, datas, conjuntos, mapas ordenados e tags binárias específicos do idioma são recusados em vez de construídos.
Infinity e NaN revelam outro limite. JavaScript pode mantê-los, mas JSON não pode escrevê-los. O conversor identifica cada caminho e avisa que o valor se torna nulo. Essa é uma etapa admitida com perdas, não uma conversão sem perdas. Um `.inf` entre aspas evita isso porque o valor permanece a string literal `.inf`.
Os dois esquemas YAML 1.2 enviados diferem apenas em formulários escalares documentados
Cole `tilde: ~`, `empty:`, `octal: 0o755`, `country: NO` e `answer: yes`. Com estrito selecionado, os valores JSON são `"~"`, `""`, `"0o755"`, `"NO"` e `"yes"`. Com Core selecionado, apenas as três primeiras alterações: til e vazio tornam-se nulos e octal torna-se 493. O país e a resposta permanecem como texto em ambas as saídas.
Agora cite cada valor e repita. Ambos os esquemas retornam strings porque a fonte indica o tipo pretendido. Esta comparação é precisa do código e mais útil do que contrastar YAML 1.1 com 1.2 dentro de uma ferramenta que nunca carrega 1.1. Ele também fornece um recurso revisável para verificar outro analisador sem adivinhar apenas sua documentação.
Exemplo resolvido: um arquivo nos esquemas restrito e principal de ToolAcre
Tags padrão explícitas são aceitas somente quando o esquema restrito as reconhece: `!!str 123` se torna a string `123`, enquanto `!!int "7"` se torna o número 7. Tags como `!!binary`, `!!timestamp`, `!!set`, `!!js/function` e construtores de objetos Python são rejeitadas. Isso evita que o leitor YAML se torne uma fábrica de objetos arbitrários.
A cotação continua sendo a opção portátil quando um valor de configuração apenas parece digitado. Ele preserva zeros à esquerda, ortografia da versão e palavras sentinela sem depender de uma tag explícita que sobreviva a outra ferramenta. O resultado JSON mostra o tipo escolhido, mas não pode conter o estilo de cotação ou tag que produziu aquele valor.
O que isso não cobre - análise em nível de aplicativo do JSON resultante, que pode forçar os tipos novamente (por exemplo, string '1' para número)
O código do aplicativo pode forçar o JSON resultante novamente. Um API pode ler `"1"` e convertê-lo em um número ou rejeitá-lo em um esquema. Os conversores de sintaxe param após produzir texto JSON; ele não executa um validador de estrutura, carregador de variável de ambiente ou regra de negócios. Uma conversão limpa, portanto, prova sintaxe e mapeamento, e não aceitação pelo serviço final.
Chaves YAML duplicadas são um problema separado. ToolAcre mantém o último valor e reporta a chave repetida com uma posição. Fluxos de vários documentos tornam-se matrizes. Essas escolhas podem alterar o que um aplicativo vê mesmo quando cada tipo escalar é esperado, portanto, leia os avisos em vez de julgar apenas o corpo JSON formatado.
Conclusão: cite qualquer coisa que uma máquina possa interpretar mal - e como a conversão de YAML em JSON no navegador revela exatamente o que cada escalar resolveu
Cite o texto que se assemelha a um token de máquina e inspecione os tipos JSON. Use strict quando desejar o menor vocabulário escalar em forma de JSON; escolha Core deliberadamente quando YAML formulários nulos e numéricos forem necessários. Nenhuma das opções é YAML 1.1 e nenhuma delas faz com que o consumidor downstream siga as mesmas regras.
O painel torna visível a escolha do analisador e retorna avisos para valores que nenhum destino pode representar. Essa é a promessa honesta: revela como esta implementação resolveu cada escalar. Ele não reivindica comportamento universal YAML nem preserva comentários, tags e ortografia durante uma viagem de ida e volta.