Português (Brasil)

Ferramentas de desenvolvedor · Conversores de sintaxe

JSON é YAML válido? O que YAML 1.2 promete e onde quebra

· Fundo

JSON yaml formatos de dados

Um documento JSON ajustado dentro de um quadro estilo fluxo YAML com recursos somente YAML externos
Ilustração vetorial original ToolAcre

YAML 1.2 foi projetado para que cada documento JSON também seja um documento YAML, e é por isso que a conversão de JSON para YAML parece trivial. Esta postagem explica o que a especificação realmente garante e os casos extremos em que a promessa falha.

Colar JSON em um arquivo YAML e sair impune - por que isso funciona e a única vez que não funcionou

Um comum JSON objeto pode ser colado no YAML lado da fonte e leia abaixo ToolAcreé YAML 1.2 JSON esquema. Colchetes, colchetes, chaves entre aspas, strings, números, booleanos e nulos tornam-se iguais JavaScript valor. Isso explica por que a fronteira muitas vezes parece trivial.

A garantia deve permanecer específica do analisador. ToolAcre restringe tags, limita aliases e aninhamentos e aplica um limite de entrada. Um texto pode ser válido sob um processador YAML mais amplo, mas ser recusado aqui por razões de segurança ou forma não relacionadas ao seu núcleo de aparência JSON.

Carregamentos comuns de JSON por meio deste leitor YAML 1.2; extensões não suportadas falham por motivos distintos

Os esquemas selecionados produzem valores em formato JSON: strings, números, booleanos, nulos, arrays e mapeamentos. Esse alinhamento permite analisar e serializar em vez da substituição de pontuação. O código-fonte não estabelece todas as palavras ou errata da especificação YAML, portanto, o artigo relata o comportamento testado em vez de reivindicar conformidade exaustiva.

No modo estrito, til, valor vazio e `0o755` permanecem strings. Esses são YAML tokens que o próprio JSON não conteria. O Core os resolve de maneira diferente, ao mesmo tempo que retorna uma saída em formato JSON.

Os esquemas enviados se alinham com os dados em formato JSON sem provar todas as vantagens das especificações

As chaves de mapeamento YAML duplicadas mantêm o último valor com um aviso; uma interpretação estrita em outro lugar pode rejeitá-los. Leitores YAML 1.1 legados podem digitar palavras como `NO` de maneira diferente, enquanto este leitor as mantém como strings. Essas diferenças complicam as declarações amplas de portabilidade.

As guias usadas como recuo produzem um erro, enquanto as guias dentro das strings JSON entre aspas são escapadas. Valores muito profundos ou superdimensionados podem atingir os limites de segurança locais. Uma relação linguística teórica não ultrapassa os limites da implementação.

Chaves duplicadas e diferenças entre analisadores legados permanecem limites de interoperabilidade

O inverso é claramente falso para este pipeline de valor. Os comentários YAML não têm representação JSON, os aliases são resolvidos em dados repetidos, os fluxos de vários documentos tornam-se matrizes e as tags não suportadas são rejeitadas. Os escalares de bloco tornam-se strings, mas sua apresentação é perdida.

Mesmo um documento YAML suportado pode, portanto, ser convertido em JSON válido e nunca retornar ao mesmo texto YAML. A igualdade de dados pode sobreviver para valores comuns, enquanto comentários, âncoras, ortografia e identidade de fluxo não.

O que isso significa para a conversão — JSON para YAML é uma mudança de estilo, YAML para JSON é uma tradução que pode perder informações

JSON-to-YAML geralmente é uma mudança de estilo e serialização para entrada em formato de JSON. YAML-to-JSON primeiro interpreta a sintaxe específica de YAML e depois projeta o resultado no modelo de valor menor de JSON. As direções não são simétricas.

ToolAcre testa documentos JSON-to-YAML-to-JSON comuns contendo valores aninhados, Unicode, nulos, matrizes e strings de aparência ambígua. Esses acessórios comprovam a classe de dados coberta, nem todos os pares de processadores JSON ou YAML possíveis.

Exemplo resolvido: um documento JSON carregado como YAML — a mesma estrutura e, em seguida, um recurso somente YAML adicionado para mostrar onde a ferramenta JSON para

Cole `{"country":"NO","items":[1,null],"nested":{"ok":true}}` como entrada YAML. O leitor estrito retorna a mesma árvore. Adicione um comentário YAML e o valor permanecerá o mesmo enquanto o comentário desaparece. Substitua um objeto repetido por uma âncora e um alias; o JSON agora contém cópias em vez de sintaxe de referência.

Adicione `---` e um segundo documento; o resultado se torna uma série de documentos com um aviso. Adicione `!!binary`; o leitor restrito recusa. Cada etapa marca um limite distinto: apresentação ignorada, estrutura resolvida, convenção de fluxo e tipo não suportado.

O que isso não cobre — compatibilidade em nível de esquema, onde tipos YAML, como carimbos de data/hora, não têm contraparte JSON

A compatibilidade do esquema não envolve apenas sintaxe de superfície. Core pode criar Infinity ou NaN, que JSON escreve como nulo com avisos. O carimbo de data/hora e as tags binárias são recusados ​​nos esquemas restritos, em vez de convertidos. ToolAcre restringe deliberadamente YAML a dados seguros no formato JSON.

Outra implementação de YAML pode oferecer suporte a tipos adicionais. Isso o torna menos compatível com valores JSON simples nesses pontos, e não automaticamente melhor ou pior. Escolha com base no contrato alvo e nos requisitos de segurança.

A compatibilidade em nível de esquema inclui valores não finitos e tags temporais que este leitor restrito limita ou recusa

Dados comuns em formato JSON passam de forma limpa por este leitor e gravador YAML 1.2. Declarações mais amplas sobre todos os documentos ou analisadores exigem acessórios que cubram chaves duplicadas, versões de esquema, tags e limites de recursos.

Use conversores de sintaxe para testar o texto real e ler seus avisos. Trate “JSON é YAML” como uma abreviação útil somente após nomear o analisador, o esquema e os recursos não suportados que tornam o limite real preciso.

Para um teste de portabilidade, mantenha um fixture inteiramente dentro do modelo de valor de JSON e outro que adicione um recurso somente de YAML por vez. Execute ambos através de cada consumidor pretendido. A primeira mede a afirmação do subconjunto prático; a segunda identifica exatamente onde divergem comentários, aliases, fluxos, tags ou regras escalares. Esse método preparado é mais informativo do que perguntar se duas linguagens são subconjuntos abstratos, porque produz falhas vinculadas aos analisadores que seu sistema realmente usa.