无法使用 yaml-cpp 发出空值

Posted

技术标签:

【中文标题】无法使用 yaml-cpp 发出空值【英文标题】:Can't Emit an Empty Value with yaml-cpp 【发布时间】:2020-05-01 21:12:30 【问题描述】:

我想发出一个空值,但是当我分配一个要发出的空字符串时,输出在技术上并不是空的。

代码片段:

YAML::Emitter out;
std::string name;
out << YAML::Key << "name";
out << YAML::Value << name;

预期的 yaml 输出:

name:

实际 yaml 输出:

name: ""

如您所见,我定义了一个空字符串,并且我希望 yaml 输出实际上是空的。 这是预期的行为吗?如果是这样,有没有办法解决这个问题?我的目标是让我的整个 yaml 输出都是免费的。

【问题讨论】:

【参考方案1】:

YAML

name:

name 没有字符串值;它实际上是一个空值。参见,例如,在线解析器here;规范的 YAML 表示是:

!!map 
  ? !!str "name"
  : !!null "null",

yaml-cpp 试图确保你告诉它的(“写这个空字符串”)是如何解析生成的 YAML,所以它把空字符串写成""

如果要写入空值,则要么不写入值,要么写入YAML::Null。后者(我相信)会产生

name: ~

这是 null 的规范形式。

【讨论】:

啊,好的。我明白这背后的原因。话虽如此,我无法发出空值的核心问题仍然存在。如果我发出 null out &lt;&lt; YAML::Value &lt;&lt; YAML::Null; 或流中没有发出任何内容 out &lt;&lt; YAML::Value; ,我会遇到格式问题。 我可能说得太早了。看起来out &lt;&lt; YAML::Value &lt;&lt; YAML::Null; 确实打印出了 ~ 正如你所说的那样,它必须足以满足我的需要。 out &lt;&lt; YAML::Value; 确实会导致奇怪的输出 yaml 格式问题。感谢您的帮助。

以上是关于无法使用 yaml-cpp 发出空值的主要内容,如果未能解决你的问题,请参考以下文章

使用 YAML-CPP 发出解析文件

如何使用 yaml-cpp 发出带引号的字符串?

如何使用 yaml-cpp 发出和解析原始二进制数据

yaml-cpp 发出的结果字符串 (!<!>) 是啥?

使用 yaml-cpp 源代码创建 dll

找到 YAML 文件,但无法解析内容