Разбор JSON-тела в C++
Тело ответа API - это всегда текст.
Перед разбором его удобно сохранить в переменную, даже если строка уже задана в программе. Библиотека nlohmann читает ключи по именам, в том числе когда значение само является объектом.
Для блока user собирают вложенный
nlohmann::json, а корневой объект ссылается
на него тем же ключом:
#include <iostream>
#include <nlohmann/json.hpp>
#include <string>
int main() {
nlohmann::json person;
person["name"] = "john";
person["surn"] = "smit";
nlohmann::json doc;
doc["user"] = person;
doc["city"] = "London";
std::cout << doc.dump() << "\n";
return 0;
}
Готовый фрагмент JSON можно разобрать сразу в дерево
и обратиться к вложенным полям через цепочку
operator[]:
#include <iostream>
#include <nlohmann/json.hpp>
#include <string>
int main() {
std::string raw = R"({
"user": {
"name": "john",
"surn": "smit"
},
"city": "London"
})";
nlohmann::json doc = nlohmann::json::parse(raw);
std::cout << doc["user"]["name"].get<std::string>() << "\n";
std::cout << doc["city"].get<std::string>() << "\n";
return 0;
}
Если в корне лежит массив строк, после разбора элементы доступны по индексу. Порядок в C++ совпадает с порядком в JSON:
#include <iostream>
#include <nlohmann/json.hpp>
#include <string>
int main() {
std::string raw = R"(["alpha","beta","gamma"])";
nlohmann::json tags = nlohmann::json::parse(raw);
std::cout << tags[0].get<std::string>() << ","
<< tags[1].get<std::string>() << ","
<< tags[2].get<std::string>() << "\n";
return 0;
}
Дана строка:
std::string raw = R"({
"user": {
"name": "john",
"surn": "smit"
},
"city": "London"
})";
Разберите ее в nlohmann::json. Выведите имя
и город на отдельных строках.