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;
        }     
    }
→ Ссылка