在 C++ 中解析字典的 YAML 列表
Parse a YAML list of dictionaries in C++
我有以下 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()
returns 1),但我一这样做:p.first.as<std::string>();
它就崩溃了。我该如何解析?
相反,如果我这样做:
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 循环进行解析?谢谢
如果您正在遍历 YAML 序列,您获得的条目是序列中的条目,不是 key/value 对:
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
具有字段 first
和 second
的原因是 yaml-cpp 中的迭代过载:您可以遍历序列(其中条目是节点)或映射(其中条目是 key/value 对)。在每种情况下,对方的语法都是静态可用的,但不会在运行时为您提供任何合理的信息。
我有以下 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()
returns 1),但我一这样做:p.first.as<std::string>();
它就崩溃了。我该如何解析?
相反,如果我这样做:
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 循环进行解析?谢谢
如果您正在遍历 YAML 序列,您获得的条目是序列中的条目,不是 key/value 对:
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
具有字段 first
和 second
的原因是 yaml-cpp 中的迭代过载:您可以遍历序列(其中条目是节点)或映射(其中条目是 key/value 对)。在每种情况下,对方的语法都是静态可用的,但不会在运行时为您提供任何合理的信息。