Несколько форм в C++
Один протокол может передавать разные сообщения: успех с суммой или отказ с причиной.
Один тип JSON на все варианты не подходит,
поэтому сначала читают строковый
тег kind, затем поля нужной
формы обычными условиями:
#include <iostream>
#include <nlohmann/json.hpp>
#include <string>
int main() {
std::string raw = R"({"kind":"paid","amount":900})";
nlohmann::json msg = nlohmann::json::parse(raw);
std::string kind = msg.at("kind").get<std::string>();
if (kind == "paid") {
int amount = msg.at("amount").get<int>();
std::cout << amount << "\n";
} else if (kind == "declined") {
std::string reason = msg.at("reason").get<std::string>();
std::cout << reason << "\n";
}
return 0;
}
При записи ту же метку кладут рядом
с полями варианта; новый вариант -
новая ветка if и свой набор
ключей в JSON:
#include <iostream>
#include <nlohmann/json.hpp>
#include <string>
int main() {
nlohmann::json declined;
declined["kind"] = "declined";
declined["reason"] = "limit";
std::cout << declined.dump() << "\n";
return 0;
}
Соберите JSON с kind "opened"
и msg_id 7. Выведите
строку dump.
Разберите
{"kind":"archived","folder":"2024"},
прочитайте kind и выведите имя
папки для варианта "archived".