Eu tenho um código C++ antigo que analisa YAML manualmente e possui um grande número de testes de unidade. Estou convertendo para C# usando YamlDotNet. Mas uma das características do código antigo era que ele conseguia lidar com um pouco de variabilidade nas listas. Por exemplo, considere a seguinte lista...
images:
- image01.png
- image02.png
- image03.png
O antigo código de análise poderia lidar com o caso em que não há espaço entre o caractere '-' e o item. Portanto, ele também pode ler isso sem problemas.
images:
- image01.png
-image02.png
- image03.png
Infelizmente, o YamlDotNet não analisa isso. Eu estava convertendo o teste de unidade que verifica isso especificamente e o YamlDotNet lança um YamlDotnet.Core.SemanticErrorException com esta mensagem
Ao analisar uma coleção de blocos, não foi encontrado o indicador '-' esperado
Mas se eu entrar e colocar o espaço de volta entre '-' e "image02.png", ele lê o yaml perfeitamente.
Então minhas perguntas são
- Isso é YAML tecnicamente válido? Ou seja, a lista acima deve sempre causar falha? Caso contrário, vou me livrar do teste de unidade.
- Mas se for YAML válido, existe uma opção que eu possa passar para o YamlDotNet Deserializer para lidar com isso?
Em YAML,
- image01.png
(com o espaço) codifica a stringimage01.png
como um item de array, enquanto-image02.png
codifica apenas a string-image02.png
(incluindo o travessão) e, como tal, invalida seu documento devido ao seu posicionamento incorreto no contexto da matriz circundante.Portanto, a resposta às suas perguntas é: Não, não é YAML válido. Consulte as especificações YAML na seção 2.1. Coleções :
O que você tem aí é uma sequência em estilo de bloco YAML, ou seja, um
block sequence
, um dos dois estilos de coleção de blocos em YAML (sendo o outro oblock mapping
). Chamá-lo de lista (ou array, ou o que quer que seja carregado, na linguagem de programação de sua escolha) torna difícil encontrar a descrição real das sequências de blocos na documentação , cujo primeiro parágrafo diz:As regras de produção indicam que
-
(chamado de indicador de entrada de sequência) não precisa ser seguido por um espaço, mas apenas se o nó seguinte estiver vazio:O que também seria YAML válido é:
Aqui a sequência que é o valor de key
images
possui dois elementos: o escalarimage01.png -image02.png
e o escalarimage03.png
.Tanto o último exemplo quanto a entrada necessária envolvem a inserção de um espaço ausente na entrada para obter o YAML correto, portanto, é difícil para um analisador YAML real dar uma boa sugestão do que está errado. Portanto, não estou surpreso que a análise "manual" tenha entendido errado.