Nlohmann JSON итераторы
Изучаю Nlohmann JSON, столкнулся с такой проблемой:
Есть файл json который нужно распарсить.
{
"progress": {
"1": {
"2019/01/01": {"plus": true, "attendance": true, "test": 3.5},
"2019/07/01": {"attendance": false}
},
"2": {
"2019/01/01": {"attendance": true, "test": 1.5},
"2019/07/01": {"plus": true, "attendance": true}
}
}
}
Не понимаю как пройтись в этом файле по всем датам.
То есть в progress мне нужно пройтись по всем циферкам и из каждой даты вытащить test. Как это можно сделать?
По циферкам я пробираюсь вот так, а как пройтись по датам не понимаю.
for (json::iterator it = file_course["progress"].begin(); it != file_course["progress"].end(); ++it) {
// Тут наверное должен быть еще один for.
}
Ответы (2 шт):
Автор решения: Fameek
→ Ссылка
Данные для работы я брал с оф сайта Nlohmann JSON (https://nlohmann.github.io/json/)
#include<iostream>
#include <fstream>
#include"nlohmann/json.hpp"
using namespace std;
using json = nlohmann::json;
int main()
{
json file_json; // создаем json объект
ifstream file("jj.json"); // открываем файл для чтения (в файле ваш json объект)
file >> file_json; // записываем в file_json данные с файла
for (int i = 0; i < file_json.at("progress").size(); i++) { // цикл идет до тех пор пока не закончится объекты в "progress" у вас это "1" и "2"
int k = i + 1; // создаем переменную равную значению в файле (если конструкция не изменится и будет продолжаться "3", "4"... то это сработает )
string i_str = to_string(k);// записываем в новый стринг эти данные (в вашем объекте "1" "2" это тип данных string)
json::iterator it = file_json.at("progress").at(i_str).begin(); // стандартная опирация с iterator (мы начинаем читать данные уже например в объекте "1")
for (int j = 0; j < file_json.at("progress").at(i_str).size(); j++) { // по аналогу с первым циклом (пока не кончатся данные)
auto test = it.value().find("test"); // мы пытаемся найти тип "Test" в объекте
if (test != it.value().end()) { // если мы нашли "test"
float test_info = test.value(); // мы вытягиваем значение с этого типа
cout << test_info << endl; // выводим результат
it++; //переходим на след элемент
}
}
}
return 0;
}
За мой стиль не бейте сильно, но я думаю как пример этот код не плохой
Автор решения: Arcanecliff
→ Ссылка
Вот решение:
for (json::iterator it = file_course["progress"].begin(); it != file_course["progress"].end(); ++it) {
for (json::iterator it1 = it.value().begin(); it1 != it.value().end(); ++it1) {
int ite = it1.value()["test"] ;
std::cout << ite << std::endl;
}
}