60 lines
1.5 KiB
C++
60 lines
1.5 KiB
C++
|
#include <iostream>
|
||
|
#include <nlohmann/json.hpp>
|
||
|
|
||
|
using json = nlohmann::json;
|
||
|
|
||
|
namespace ns
|
||
|
{
|
||
|
enum TaskState
|
||
|
{
|
||
|
TS_STOPPED,
|
||
|
TS_RUNNING,
|
||
|
TS_COMPLETED,
|
||
|
TS_INVALID = -1
|
||
|
};
|
||
|
|
||
|
NLOHMANN_JSON_SERIALIZE_ENUM(TaskState,
|
||
|
{
|
||
|
{ TS_INVALID, nullptr },
|
||
|
{ TS_STOPPED, "stopped" },
|
||
|
{ TS_RUNNING, "running" },
|
||
|
{ TS_COMPLETED, "completed" }
|
||
|
})
|
||
|
|
||
|
enum class Color
|
||
|
{
|
||
|
red, green, blue, unknown
|
||
|
};
|
||
|
|
||
|
NLOHMANN_JSON_SERIALIZE_ENUM(Color,
|
||
|
{
|
||
|
{ Color::unknown, "unknown" }, { Color::red, "red" },
|
||
|
{ Color::green, "green" }, { Color::blue, "blue" }
|
||
|
})
|
||
|
} // namespace ns
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
// serialization
|
||
|
json j_stopped = ns::TS_STOPPED;
|
||
|
json j_red = ns::Color::red;
|
||
|
std::cout << "ns::TS_STOPPED -> " << j_stopped
|
||
|
<< ", ns::Color::red -> " << j_red << std::endl;
|
||
|
|
||
|
// deserialization
|
||
|
json j_running = "running";
|
||
|
json j_blue = "blue";
|
||
|
auto running = j_running.template get<ns::TaskState>();
|
||
|
auto blue = j_blue.template get<ns::Color>();
|
||
|
std::cout << j_running << " -> " << running
|
||
|
<< ", " << j_blue << " -> " << static_cast<int>(blue) << std::endl;
|
||
|
|
||
|
// deserializing undefined JSON value to enum
|
||
|
// (where the first map entry above is the default)
|
||
|
json j_pi = 3.14;
|
||
|
auto invalid = j_pi.template get<ns::TaskState>();
|
||
|
auto unknown = j_pi.template get<ns::Color>();
|
||
|
std::cout << j_pi << " -> " << invalid << ", "
|
||
|
<< j_pi << " -> " << static_cast<int>(unknown) << std::endl;
|
||
|
}
|