我有旧的 C++ 代码,它手动解析 YAML 并有大量的单元测试。我使用 YamlDotNet 将其转换为 C#。但旧代码的特点之一是它可以处理列表中的一些变化。例如,考虑以下列表...
images:
- image01.png
- image02.png
- image03.png
旧的解析代码可以处理“-”字符和项目之间没有空格的情况。所以它也可以毫无问题地读取这个。
images:
- image01.png
-image02.png
- image03.png
不幸的是 YamlDotNet 不解析这个。我正在转换专门验证这一点的单元测试,并且 YamlDotNet 抛出 YamlDotnet.Core.SemanticErrorException 并显示此消息
解析块集合时,未找到预期的“-”指示符
但是,如果我然后进去并将空格放回“-”和“image02.png”之间,它就会完美地读取 yaml。
所以我的问题是
- 这在技术上是有效的 YAML 吗?也就是说,上面的列表是否总是会导致错误?如果没有,我就去掉单元测试。
- 但如果它是有效的 YAML,是否有一个选项可以传递给 YamlDotNet 反序列化器来处理它?
在 YAML 中,
- image01.png
(带有空格)将字符串编码image01.png
为数组项,而-image02.png
仅对字符串-image02.png
(包括破折号)进行编码,因此由于其在周围数组上下文中的错误位置而使您的文档无效。因此,您的问题的答案是:不,它不是有效的 YAML。请参阅第 2.1节下的YAML 规范。收藏:
您拥有的是块样式 YAML 中的序列,即 a
block sequence
,YAML 中的两种块集合样式之一(另一个是block mapping
)。将其称为列表(或数组,或加载到您选择的编程语言中的任何内容)使得很难在文档中找到块序列的实际描述,其第一段内容如下:那里的产生规则表明
-
(称为序列条目指示符)后面不必跟空格,但前提是以下节点为空:有效的 YAML 还包括:
这里,作为 key 的值的序列
images
有两个元素:标量image01.png -image02.png
和 标量image03.png
。后一个示例和您所需的输入都涉及在输入中插入一个缺失的空格以获得正确的 YAML,因此真正的 YAML 解析器很难给出错误的良好建议。所以我对“手动”解析出错并不感到惊讶。