# nlohmann::adl_serializer::from_json ``` // (1) template static auto from_json(BasicJsonType && j, TargetType& val) noexcept( noexcept(::nlohmann::from_json(std::forward(j), val))) -> decltype(::nlohmann::from_json(std::forward(j), val), void()) // (2) template static auto from_json(BasicJsonType && j) noexcept( noexcept(::nlohmann::from_json(std::forward(j), detail::identity_tag {}))) -> decltype(::nlohmann::from_json(std::forward(j), detail::identity_tag {})) ``` This function is usually called by the [`get()`](https://json.nlohmann.me/api/basic_json/get/index.md) function of the [basic_json](https://json.nlohmann.me/api/basic_json/index.md) class (either explicitly or via the conversion operators). 1. This function is chosen for default-constructible value types. 1. This function is chosen for value types which are not default-constructible. ## Parameters `j` (in) : JSON value to read from `val` (out) : value to write to ## Return value 1. (none) -- the converted value is written to the output parameter `val`. 1. the JSON value `j` converted to `TargetType` ## Examples Example: (1) Default-constructible type The example below shows how a `from_json` function can be implemented for a user-defined type. This function is called by the `adl_serializer` when `get()` is called. ``` #include #include using json = nlohmann::json; namespace ns { // a simple struct to model a person struct person { std::string name; std::string address; int age; }; } // namespace ns namespace ns { void from_json(const json& j, person& p) { j.at("name").get_to(p.name); j.at("address").get_to(p.address); j.at("age").get_to(p.age); } } // namespace ns int main() { json j; j["name"] = "Ned Flanders"; j["address"] = "744 Evergreen Terrace"; j["age"] = 60; auto p = j.get(); std::cout << p.name << " (" << p.age << ") lives in " << p.address << std::endl; } ``` Output: ``` Ned Flanders (60) lives in 744 Evergreen Terrace ``` Example: (2) Non-default-constructible type The example below shows how a `from_json` is implemented as part of a specialization of the `adl_serializer` to realize the conversion of a non-default-constructible type. ``` #include #include using json = nlohmann::json; namespace ns { // a simple struct to model a person (not default constructible) struct person { person(std::string n, std::string a, int aa) : name(std::move(n)), address(std::move(a)), age(aa) {} std::string name; std::string address; int age; }; } // namespace ns namespace nlohmann { template <> struct adl_serializer { static ns::person from_json(const json& j) { return {j.at("name"), j.at("address"), j.at("age")}; } // Here's the catch! You must provide a to_json method! Otherwise, you // will not be able to convert person to json, since you fully // specialized adl_serializer on that type static void to_json(json& j, ns::person p) { j["name"] = p.name; j["address"] = p.address; j["age"] = p.age; } }; } // namespace nlohmann int main() { json j; j["name"] = "Ned Flanders"; j["address"] = "744 Evergreen Terrace"; j["age"] = 60; auto p = j.get(); std::cout << p.name << " (" << p.age << ") lives in " << p.address << std::endl; } ``` Output: ``` Ned Flanders (60) lives in 744 Evergreen Terrace ``` ## See also - [to_json](https://json.nlohmann.me/api/adl_serializer/to_json/index.md) ## Version history - Added in version 2.1.0.