解析序列/映射节点时YAML无效节点错误及重复键问题咨询
关于重复
run键YAML解析错误的解决方案 嘿,我来帮你捋清楚这个问题的核心和解决方向~
首先得明确:你给出的这段YAML结构本身是完全符合规范的!你可能误解了“映射键必须唯一”的范围——这个要求是指同一个映射内部的键不能重复,而你这里的work是一个序列(数组),序列里的每个元素都是独立的映射,每个映射里只有一个run键,完全合规。举个类似的例子:
fruits: - name: apple - name: banana
没人会觉得这个YAML有问题吧?你的work结构和它是一个道理。
那解析时出现的“无效YAML节点错误”,大概率是下面两个原因之一:
1. 解析代码误把work当成了映射而非序列
很多时候报错是因为解析逻辑和YAML结构不匹配。比如用yaml-cpp解析时,你可能错误地试图直接从work里取run键(把它当成了映射),但实际上work是序列,得遍历它的元素才行。
举个错误的解析代码例子:
// 错把work当成映射,直接取run键肯定报错 YAML::Node work = config["work"]; YAML::Node run = work["run"];
改成正确的序列遍历逻辑就好:
YAML::Node work = config["work"]; if (work.IsSequence()) { for (const auto& item : work) { // 每个item都是带run键的独立映射 YAML::Node run_node = item["run"]; // 接下来正常解析type、figures等内容 std::string workout_type = run_node["type"].as<std::string>(); int start = run_node["figures"]["start_time"]["start"].as<int>(); // ... 其他解析逻辑 } }
2. 你可能对生成的结构有误解
如果你是疑惑“为什么yaml-cpp允许生成这样的结构”——因为这完全合规呀!yaml-cpp不会阻止你生成合法的序列+映射结构。但如果你的本意是生成一个映射(里面包含多个run键),那才是违反规范的,yaml-cpp在这种情况下通常会覆盖重复的键,或者某些版本会抛出错误,但你现在的结构是序列,完全没问题。
总结
先检查你的解析代码,确认是否正确识别了work的序列类型,调整遍历逻辑后应该就能解决错误。如果还有其他细节问题,可以把解析代码的片段贴出来,再进一步排查~
内容的提问来源于stack exchange,提问作者MarKS
相关产品推荐
相关产品推荐

