Библиотека nlohmann json позиционирует себя как «JSON для современного C ++» и стремится вести себя «как контейнер STL».Однако в стандартной библиотеке C ++ нет контейнера, который был бы «векторным» и «подобным карте» и который поддерживал бы итераторы начала / конца для значений, и итераторы начала / конца для пар ключ / значение.Поэтому нужно что-то новое.
Первоначальным решением nlohmann было скопировать подход jsoncpp , который поддерживает итераторы начала / конца для массивов json, и добавляет явно нестандартную функцию key()
китератор для поддержки объектов json.Таким образом, вы могли бы написать
for (auto it = RecentFiles.begin(); it != RecentFiles.end(); ++it)
{
std::cout << it.key() << "\n";
std::cout << (*it)["Name"].get<std::string>() << "\n";
std::cout << (*it)["Last modified"].get<std::string>() << "\n";
}
Но, будучи нестандартным способом итерации по ключу / значениям, он не имеет стандартной поддержки библиотеки для диапазона, основанного на циклах по ключу / значениям.
nlohmannпозже добавлена функция json::items()
, которая поддерживает итерацию по объектам json со стандартными итераторами и которая поддерживает стандартную библиотеку для поддержки диапазона, основанного на циклах, а именно:
int main()
{
json RecentFiles;
RecentFiles["1"]["Name"] = "test1.txt";
RecentFiles["1"]["Last modified"] = "monday";
RecentFiles["1"]["Score"] = 5.0f;
RecentFiles["2"]["Name"] = "test2.txt";
RecentFiles["2"]["Last modified"] = "tuesday";
RecentFiles["2"]["Score"] = 5.0f;
for (const auto& item : RecentFiles.items())
{
std::cout << item.key() << "\n";
for (const auto& val : item.value().items())
{
std::cout << " " << val.key() << ": " << val.value() << "\n";
}
}
std::cout << "\nor\n\n";
for (const auto& item : RecentFiles.items())
{
std::cout << item.key() << "\n";
std::cout << " " << item.value()["Name"].get<std::string>() << "\n";
std::cout << " " << item.value()["Last modified"].get<std::string>() << "\n";
std::cout << " " << item.value()["Score"].get<double>() << "\n";
}
}
Вывод:
1
Last modified: "monday"
Name: "test1.txt"
Score: 5.0
2
Last modified: "tuesday"
Name: "test2.txt"
Score: 5.0
or
1
test1.txt
monday
5
2
test2.txt
tuesday
5