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_ci// a simple struct to model a person (not default constructible)
9c5f01b2fSopenharmony_cistruct person
10c5f01b2fSopenharmony_ci{
11c5f01b2fSopenharmony_ci    person(std::string n, std::string a, int aa)
12c5f01b2fSopenharmony_ci        : name(std::move(n)), address(std::move(a)), age(aa)
13c5f01b2fSopenharmony_ci    {}
14c5f01b2fSopenharmony_ci
15c5f01b2fSopenharmony_ci    std::string name;
16c5f01b2fSopenharmony_ci    std::string address;
17c5f01b2fSopenharmony_ci    int age;
18c5f01b2fSopenharmony_ci};
19c5f01b2fSopenharmony_ci} // namespace ns
20c5f01b2fSopenharmony_ci
21c5f01b2fSopenharmony_cinamespace nlohmann
22c5f01b2fSopenharmony_ci{
23c5f01b2fSopenharmony_citemplate <>
24c5f01b2fSopenharmony_cistruct adl_serializer<ns::person>
25c5f01b2fSopenharmony_ci{
26c5f01b2fSopenharmony_ci    static ns::person from_json(const json& j)
27c5f01b2fSopenharmony_ci    {
28c5f01b2fSopenharmony_ci        return {j.at("name"), j.at("address"), j.at("age")};
29c5f01b2fSopenharmony_ci    }
30c5f01b2fSopenharmony_ci
31c5f01b2fSopenharmony_ci    // Here's the catch! You must provide a to_json method! Otherwise, you
32c5f01b2fSopenharmony_ci    // will not be able to convert person to json, since you fully
33c5f01b2fSopenharmony_ci    // specialized adl_serializer on that type
34c5f01b2fSopenharmony_ci    static void to_json(json& j, ns::person p)
35c5f01b2fSopenharmony_ci    {
36c5f01b2fSopenharmony_ci        j["name"] = p.name;
37c5f01b2fSopenharmony_ci        j["address"] = p.address;
38c5f01b2fSopenharmony_ci        j["age"] = p.age;
39c5f01b2fSopenharmony_ci    }
40c5f01b2fSopenharmony_ci};
41c5f01b2fSopenharmony_ci} // namespace nlohmann
42c5f01b2fSopenharmony_ci
43c5f01b2fSopenharmony_ciint main()
44c5f01b2fSopenharmony_ci{
45c5f01b2fSopenharmony_ci    json j;
46c5f01b2fSopenharmony_ci    j["name"] = "Ned Flanders";
47c5f01b2fSopenharmony_ci    j["address"] = "744 Evergreen Terrace";
48c5f01b2fSopenharmony_ci    j["age"] = 60;
49c5f01b2fSopenharmony_ci
50c5f01b2fSopenharmony_ci    auto p = j.get<ns::person>();
51c5f01b2fSopenharmony_ci
52c5f01b2fSopenharmony_ci    std::cout << p.name << " (" << p.age << ") lives in " << p.address << std::endl;
53c5f01b2fSopenharmony_ci}
54