mirror of
https://github.com/nlohmann/json.git
synced 2026-07-09 20:15:12 +00:00
158 lines
3.8 KiB
Markdown
158 lines
3.8 KiB
Markdown
# nlohmann::adl_serializer::from_json
|
|
|
|
```
|
|
// (1)
|
|
template<typename BasicJsonType, typename TargetType = ValueType>
|
|
static auto from_json(BasicJsonType && j, TargetType& val) noexcept(
|
|
noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), val)))
|
|
-> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), val), void())
|
|
|
|
// (2)
|
|
template<typename BasicJsonType, typename TargetType = ValueType>
|
|
static auto from_json(BasicJsonType && j) noexcept(
|
|
noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {})))
|
|
-> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {}))
|
|
```
|
|
|
|
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<ns::person>()` is called.
|
|
|
|
```
|
|
#include <iostream>
|
|
#include <nlohmann/json.hpp>
|
|
|
|
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<ns::person>();
|
|
|
|
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 <iostream>
|
|
#include <nlohmann/json.hpp>
|
|
|
|
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<ns::person>
|
|
{
|
|
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<ns::person>();
|
|
|
|
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.
|