Продолжая мой предыдущий вопрос здесь, теперь я хочу вставить ключи и значения, представленные в приведенном ниже json, в std::vector<std::pair<std::string, std::vector<uint64_t>>> vec;
Ключами здесь являются следующие строки: 12CUDzb3oe8RBQ4tYGqsuPsCbsVE4KWfktXRihXf8Ggq
, 12ashmTiFStQ8RGUpi1BTCinJakVyDKWjRL6SWhnbxbT
соответствующие им значения перечислены в списке:[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));
Теперь я пытаюсь таким образом вставить все ключевые значения в вектор
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
Может кто-нибудь, пожалуйста, каков правильный способ сделать это?
Я думаю, вы слишком усложняете это. Вы можете перебирать объект json
так же, как и любой другой контейнер, используя цикл for
:
#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;
Ого... it.value()
вместо моего слишком сложного решения. Великолепно! +1 и удаление моего ответа.
@TedLyngmo да, библиотека делает все за вас, практически никогда не нужно ничего делать с векторами напрямую
Да, я использовал его, но только 1-2 дня здесь и там с перерывом в несколько лет, поэтому я еще не освоился с ним. Несколько лет назад я внимательно изучил код библиотеки и помню, как был впечатлен тем, насколько хорошо он написан, как мне казалось.
Похоже, что итераторы json не имеют произвольного доступа. Вместо увеличения смещения, как насчет
for(auto it = j.begin(); it != j.end(); ++it)
?