1c5f01b2fSopenharmony_ci#include <iostream>
2c5f01b2fSopenharmony_ci#include <nlohmann/json.hpp>
3c5f01b2fSopenharmony_ci
4c5f01b2fSopenharmony_ciusing json = nlohmann::json;
5c5f01b2fSopenharmony_ci
6c5f01b2fSopenharmony_cinamespace ns
7c5f01b2fSopenharmony_ci{
8c5f01b2fSopenharmony_cienum TaskState
9c5f01b2fSopenharmony_ci{
10c5f01b2fSopenharmony_ci    TS_STOPPED,
11c5f01b2fSopenharmony_ci    TS_RUNNING,
12c5f01b2fSopenharmony_ci    TS_COMPLETED,
13c5f01b2fSopenharmony_ci    TS_INVALID = -1
14c5f01b2fSopenharmony_ci};
15c5f01b2fSopenharmony_ci
16c5f01b2fSopenharmony_ciNLOHMANN_JSON_SERIALIZE_ENUM(TaskState,
17c5f01b2fSopenharmony_ci{
18c5f01b2fSopenharmony_ci    { TS_INVALID, nullptr },
19c5f01b2fSopenharmony_ci    { TS_STOPPED, "stopped" },
20c5f01b2fSopenharmony_ci    { TS_RUNNING, "running" },
21c5f01b2fSopenharmony_ci    { TS_COMPLETED, "completed" }
22c5f01b2fSopenharmony_ci})
23c5f01b2fSopenharmony_ci
24c5f01b2fSopenharmony_cienum class Color
25c5f01b2fSopenharmony_ci{
26c5f01b2fSopenharmony_ci    red, green, blue, unknown
27c5f01b2fSopenharmony_ci};
28c5f01b2fSopenharmony_ci
29c5f01b2fSopenharmony_ciNLOHMANN_JSON_SERIALIZE_ENUM(Color,
30c5f01b2fSopenharmony_ci{
31c5f01b2fSopenharmony_ci    { Color::unknown, "unknown" }, { Color::red, "red" },
32c5f01b2fSopenharmony_ci    { Color::green, "green" }, { Color::blue, "blue" }
33c5f01b2fSopenharmony_ci})
34c5f01b2fSopenharmony_ci} // namespace ns
35c5f01b2fSopenharmony_ci
36c5f01b2fSopenharmony_ciint main()
37c5f01b2fSopenharmony_ci{
38c5f01b2fSopenharmony_ci    // serialization
39c5f01b2fSopenharmony_ci    json j_stopped = ns::TS_STOPPED;
40c5f01b2fSopenharmony_ci    json j_red = ns::Color::red;
41c5f01b2fSopenharmony_ci    std::cout << "ns::TS_STOPPED -> " << j_stopped
42c5f01b2fSopenharmony_ci              << ", ns::Color::red -> " << j_red << std::endl;
43c5f01b2fSopenharmony_ci
44c5f01b2fSopenharmony_ci    // deserialization
45c5f01b2fSopenharmony_ci    json j_running = "running";
46c5f01b2fSopenharmony_ci    json j_blue = "blue";
47c5f01b2fSopenharmony_ci    auto running = j_running.get<ns::TaskState>();
48c5f01b2fSopenharmony_ci    auto blue = j_blue.get<ns::Color>();
49c5f01b2fSopenharmony_ci    std::cout << j_running << " -> " << running
50c5f01b2fSopenharmony_ci              << ", " << j_blue << " -> " << static_cast<int>(blue) << std::endl;
51c5f01b2fSopenharmony_ci
52c5f01b2fSopenharmony_ci    // deserializing undefined JSON value to enum
53c5f01b2fSopenharmony_ci    // (where the first map entry above is the default)
54c5f01b2fSopenharmony_ci    json j_pi = 3.14;
55c5f01b2fSopenharmony_ci    auto invalid = j_pi.get<ns::TaskState>();
56c5f01b2fSopenharmony_ci    auto unknown = j_pi.get<ns::Color>();
57c5f01b2fSopenharmony_ci    std::cout << j_pi << " -> " << invalid << ", "
58c5f01b2fSopenharmony_ci              << j_pi << " -> " << static_cast<int>(unknown) << std::endl;
59c5f01b2fSopenharmony_ci}
60