nlohmann_define_type_intrusive_with_default_macro.cpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include <iostream>
  2. #include <nlohmann/json.hpp>
  3. using json = nlohmann::json;
  4. using namespace nlohmann::literals;
  5. namespace ns
  6. {
  7. class person
  8. {
  9. private:
  10. std::string name = "John Doe";
  11. std::string address = "123 Fake St";
  12. int age = -1;
  13. public:
  14. person() = default;
  15. person(std::string name_, std::string address_, int age_)
  16. : name(std::move(name_)), address(std::move(address_)), age(age_)
  17. {}
  18. NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(person, name, address, age)
  19. };
  20. } // namespace ns
  21. int main()
  22. {
  23. ns::person p = {"Ned Flanders", "744 Evergreen Terrace", 60};
  24. // serialization: person -> json
  25. json j = p;
  26. std::cout << "serialization: " << j << std::endl;
  27. // deserialization: json -> person
  28. json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json;
  29. auto p2 = j2.get<ns::person>();
  30. // incomplete deserialization:
  31. json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json;
  32. auto p3 = j3.get<ns::person>();
  33. std::cout << "roundtrip: " << json(p3) << std::endl;
  34. }