使用yaml-cpp解析YAML时为何需额外索引获取节点数据?
问题:解析YAML时为何需要额外索引才能获取值?
我尝试使用以下C++程序解析YAML文件,但遇到一个问题——machine["num_cores"]返回空值,必须使用额外索引machine[1]["num_cores"]才能获取集群节点的num_cores值。这是怎么回事?我是否操作有误?
C++解析代码
#include <iostream> #include <yaml-cpp/yaml.h> int main() { YAML::Node config = YAML::LoadFile("test.yaml"); YAML::Node machine = config["cluster"][0]; std::cout << machine << std::endl; std::cout << "-----" << std::endl; std::cout << machine["num_cores"] << std::endl; std::cout << "-----" << std::endl; std::cout << machine[1] << std::endl; // 为什么需要索引1? std::cout << "-----" << std::endl; std::cout << machine[1]["num_cores"] << std::endl; return 0; }
待解析的YAML文件
cluster: - 1: num_cores: 4 memory_in_gb: 64 - 2: num_cores: 2 memory_in_gb: 32
程序输出结果
1: num_cores: 4 memory_in_gb: 64 ----- ----- num_cores: 4 memory_in_gb: 64 ----- 4
问题原因与解决方法
核心问题是你的YAML结构和代码访问逻辑不匹配:
你的cluster是一个数组,数组中的每个元素不是直接包含num_cores的对象,而是一个仅包含数字键的单键映射。比如数组第一个元素是{1: {num_cores:4, memory_in_gb:64}},当你用config["cluster"][0]拿到machine节点时,这个节点本身是一个映射(map),它的键是1,而不是直接包含num_cores键。这就是machine["num_cores"]返回空值的原因——machine节点根本没有这个键,它的子节点(键为1的节点)才包含num_cores。
两种解决方式:
- 修改YAML结构(更推荐)
如果数字只是节点的标识,不需要作为映射键,直接改成带id字段的对象数组,结构更直观:
cluster: - id: 1 num_cores: 4 memory_in_gb: 64 - id: 2 num_cores: 2 memory_in_gb: 32
修改后代码里直接用machine["num_cores"]就能访问到对应值,无需额外索引。
- 调整代码访问逻辑
如果必须保留原YAML结构,需要先获取映射中的子节点:
// 方式一:遍历映射(兼容键不固定的情况) for (const auto& entry : machine) { YAML::Node node = entry.second; std::cout << node["num_cores"] << std::endl; } // 方式二:直接按键访问(键固定为数字时) std::cout << machine["1"]["num_cores"] << std::endl; // 注:yaml-cpp支持用字符串或整数访问数字键,machine[1]也能生效
内容的提问来源于stack exchange,提问作者Olumide
相关产品推荐
相关产品推荐

