在nlohmann::json上使用迭代器进行迭代?错误:无效的迭代器

fiei3ece  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(231)

继续我之前的问题here,现在我想将下面json中的键和值插入std::vector<std::pair<std::string, std::vector<uint64_t>>> vec;
这里的键是这样的字符串:12CUDzb3oe8RBQ4tYGqsuPsCbsVE4KWfktXRihXf8Ggq12ashmTiFStQ8RGUpi1BTCinJakVyDKWjRL6SWhnbxbT
与之对应的值列表如下:[20964,347474, 34747][1992,1993,109096]
这是来自查询的响应json。

j =   {
                "12CUDzb3oe8RBQ4tYGqsuPsCbsVE4KWfktXRihXf8Ggq": [
                    20964,
                    347474,
                    347475
                ],
                "12ashmTiFStQ8RGUpi1BTCinJakVyDKWjRL6SWhnbxbT": [
                    1992,
                    1993,
                    109096  
                ]
        }

首先,我试着只插入第一个元素的键和值。它工作正常。

std::vector<std::pair<std::string, std::vector<uint64_t>>> vec;
  auto key = j.begin().key();
  auto value = j.begin().value();
  vec.push_back(std::make_pair(key, value));

现在我尝试用这种方法将所有键值插入到vector中

std::vector<std::pair<std::string, std::vector<uint64_t>>> vec;
  int i = 0;
  while ((j.begin() + i) != j.end()) {
    auto key = (j.begin() + i).key();
    auto value = (j.begin() + i).value();
    vec.push_back(std::make_pair(key, value));
    i++;
  }

我收到错误:

[json.exception.invalid_iterator.209]
cannot use offsets with object iterators

有人能请问做这件事的正确方法是什么?

l7wslrjt

l7wslrjt1#

我认为你把这个问题复杂化了。你可以用for循环遍历json对象,就像遍历其他容器一样:

#include "nlohmann/json.hpp"
#include <iostream>

int main()
{
    nlohmann::json j = nlohmann::json::parse(R"({
                "12CUDzb3oe8RBQ4tYGqsuPsCbsVE4KWfktXRihXf8Ggq": [
                    20964,
                    347474,
                    347475
                ],
                "12ashmTiFStQ8RGUpi1BTCinJakVyDKWjRL6SWhnbxbT": [
                    1992,
                    1993,
                    109096  
                ]
        })");
    std::vector<std::pair<std::string, std::vector<uint64_t>>> vec;
    for (auto it = j.begin(); it != j.end(); ++it)    
    {
        vec.emplace_back(it.key(), it.value());
    }
    for (auto& it : vec)
    {
        std::cout << it.first << ": ";
        for (auto& value : it.second)
        {
            std::cout << value << ", ";
        }
        std::cout << "\n";
    }
}

如果你不关心条目的顺序(JSON键是无序的,nlohmann默认情况下不保持顺序),那么你可以在一个行程序中完成:

std::map<std::string, std::vector<uint64_t>> vec = j;

相关问题