nlohmann::json迭代器报错invalid_iterator,如何遍历存入vector?
解决nlohmann::json对象遍历偏移量报错问题
你遇到的json.exception.invalid_iterator.209错误,核心原因是nlohmann::json的对象迭代器属于双向迭代器(类似std::map迭代器),不支持偏移量操作(比如it + n)。只有随机访问迭代器(如JSON数组迭代器、std::vector迭代器)才支持偏移操作,而JSON对象属于关联容器类型,迭代器不具备该特性。
以下是两种正确的实现方式:
方式1:范围for遍历(推荐,代码简洁)
利用j.items()获取JSON对象的键值对视图,直接遍历每个键值对:
// 假设j是你查询返回的nlohmann::json对象 std::vector<std::pair<std::string, std::vector<uint64_t>>> vec; // C++17及以上支持结构化绑定写法 for (const auto& [key, value] : j.items()) { // 将JSON数组转换为vector<uint64_t> std::vector<uint64_t> num_list = value.get<std::vector<uint64_t>>(); vec.emplace_back(key, num_list); }
如果是C++11/14环境(不支持结构化绑定),改用如下写法:
for (const auto& item : j.items()) { std::string key = item.key(); std::vector<uint64_t> num_list = item.value().get<std::vector<uint64_t>>(); vec.push_back(std::make_pair(key, num_list)); }
方式2:显式迭代器遍历
如果需要手动控制迭代器(比如中途终止遍历),可以用双向迭代器的常规遍历方式:
std::vector<std::pair<std::string, std::vector<uint64_t>>> vec; for (auto it = j.begin(); it != j.end(); ++it) { std::string key = it.key(); std::vector<uint64_t> num_list = it.value().get<std::vector<uint64_t>>(); vec.emplace_back(key, num_list); }
注意:不要对JSON对象的迭代器使用it + 1、it += n这类偏移操作,这会触发你遇到的迭代器类型错误。
内容的提问来源于stack exchange,提问作者Senor Maldona
相关产品推荐
相关产品推荐

