- 我有一个库在加载空字符串(
''
(时没有返回任何文档,我想知道这是否是一个错误。 - 我无法从 YAML 1.2 规范(最近提出此问题时(推断空字符串是否是有效的 YAML 文档。
- 各种(在线(YAML 验证器需要至少一个字符来显示结果,例如 YAMLValidator.com 或 OnlineYAMLTools.com。
- YAMLLint.com 接受空字符串作为输入,但在验证时将输入文本更改为
--- false
,从而引发空字符串是否实际上是输入的问题。
那么,一般来说,空字符串是有效的 YAML 文档吗?
YAML文件由解析器解析为YAML 流。一个 YAML 流可以包含多个文档。规范中此流的定义如下:
l-yaml-stream ::= l-document-prefix* l-any-document?
( l-document-suffix+ l-document-prefix* l-any-document?
| l-document-prefix* l-explicit-document? )*
如您所见,由于l-document-prefix
和l-any-document
都是可选的,因此空的 YAML 流是有效的 -但不包含任何文档。
如果你问l-any-document
是否可以产生空字符串,答案是否定的。如果没有起始---
,则有一个必须至少包含一个节点的l-bare-document
。一个普通的标量是由ns-plain(n,c)
产生的,如果你下降到那里,你会注意到它必须至少包含一个由ns-plain-first(c)
产生的字符。
如果要使 YAML 流包含一个包含空标量作为根节点的文档,则有以下选项:
- 空带引号的标量(
""
或''
( – 最好是希望标量作为字符串加载,因为非引号的空标量应该根据规范中定义的模式解析为!!null
。 - 显式文档 (
---
(。由于文档以指令结束标记显式开头,因此允许它没有内容,这在顶层被解释为空标量。 - 带有标记 (
--- !!str
( 的显式文档可确保空标量作为字符串加载。
编辑:该YAMLlint网站上的注释:不要使用它。它不会告诉您它正在使用哪种实现,它期望哪个 YAML 版本等。它的输出指示它将空输入解析为具有空标量的单个文档,并将该标量解析为布尔值false
。虽然这是规范允许的(因为规范不会在实现上强制任何特定的模式(,但它不符合任何官方方案。