在 C++ 中解析 YAML 字典列表

Posted

技术标签:

【中文标题】在 C++ 中解析 YAML 字典列表【英文标题】:Parse a YAML list of dictionaries in C++ 【发布时间】:2016-12-08 11:40:02 【问题描述】:

我有以下 yaml(我的案例的简化版本):

---
my_list:
    - item1:
        name: name1
    - item2:
        name: name2

然后我尝试使用 C++ 和 YAML-CPP 像这样解析它:

for (const auto & p : node["my_list"]) 
    std::cout << p.IsMap() << std::endl;
    YAML::Node key = p.first;
    YAML::Node value = p.second;

这显然有效(IsMap() 返回 1),但只要我这样做:p.first.as&lt;std::string&gt;(); 它就会崩溃。我应该如何解析这个?

相反,如果我这样做:

for (auto it = node.begin(); it != node.end(); ++it) 
    YAML::Node key = it->first;
    YAML::Node value = it->second;
    std::cout << key.as<std::string>() << std::endl;

这里的输出是my_list,所以我可以继续解析。

我的问题是:如何使用 C++11 范围 for 循环进行解析?谢谢

【问题讨论】:

你确定 p 是一对<:node yaml::node>,而不是第一个和第二个可转换为 YAML::Nodes 的东西吗? 不,我不确定。我不清楚 YAML-CPP 库如何。我尝试了其他东西,例如p.as&lt;std::string&gt;()。如果我做一个字典很容易解析,但由于某种原因列表不是。 我终于找到了答案,虽然我不知道为什么! for (const auto &amp; p : node["my_list"]) 似乎返回列表本身,因此您可以执行 p[0], p[1]...'. The dictionary is an element of the list, so another for loop is required for every dictionary: for (const auto & elem : p)`。如果没有人提供更好的答案和更好的解释,我会写这个作为答案。 【参考方案1】:

如果您正在遍历 YAML 序列,您获得的条目是序列中的条目,不是键/值对:

for (const auto& p : node["my_list"]) 
    std::cout << p.IsMap() << "\n";
    // Here 'p' is a map node, not a pair.
    for (const auto& key_value : p) 
      // Now 'key_value' is a key/value pair, so you can read it:
      YAML::Node key = key_value.first;
      YAML::Node value = key_value.second;
      std::string s = key.as<std::string>();
      // ....
    

p 有字段 firstsecond 的原因是 yaml-cpp 中的迭代超载:您可以遍历序列(条目是节点)或映射(条目是键/值)对)。在每种情况下,对方的语法都是静态可用的,但不会在运行时为您提供任何合理的信息。

【讨论】:

非常感谢!但是,我不明白为什么如果p 是地图节点,序列的元素,为什么我不能p[0].first.as&lt;std::string&gt;() 如果p 是一个map 节点,那么p[0] 指的是与键0 关联的值,这不是您所指的。你有什么问题?

以上是关于在 C++ 中解析 YAML 字典列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在yaml中制作关联数组列表

使用 ansible 访问字典文件的 yaml 列表

使用golang解析yamljsonxml文件

Ansible-playbook 学习

关于yaml语言

将3个列表解析为python中的字典列表