📝 add more missing examples
This commit is contained in:
parent
05c08a2ac4
commit
ce139af67a
37
docs/examples/from_json__default_constructible.cpp
Normal file
37
docs/examples/from_json__default_constructible.cpp
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#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;
|
||||||
|
}
|
||||||
1
docs/examples/from_json__default_constructible.output
Normal file
1
docs/examples/from_json__default_constructible.output
Normal file
@ -0,0 +1 @@
|
|||||||
|
Ned Flanders (60) lives in 744 Evergreen Terrace
|
||||||
53
docs/examples/from_json__non_default_constructible.cpp
Normal file
53
docs/examples/from_json__non_default_constructible.cpp
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#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;
|
||||||
|
}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
Ned Flanders (60) lives in 744 Evergreen Terrace
|
||||||
32
docs/examples/to_json.cpp
Normal file
32
docs/examples/to_json.cpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#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 to_json(json& j, const person& p)
|
||||||
|
{
|
||||||
|
j = json{ {"name", p.name}, {"address", p.address}, {"age", p.age} };
|
||||||
|
}
|
||||||
|
} // namespace ns
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
ns::person p = {"Ned Flanders", "744 Evergreen Terrace", 60};
|
||||||
|
|
||||||
|
json j = p;
|
||||||
|
|
||||||
|
std::cout << j << std::endl;
|
||||||
|
}
|
||||||
1
docs/examples/to_json.output
Normal file
1
docs/examples/to_json.output
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"address":"744 Evergreen Terrace","age":60,"name":"Ned Flanders"}
|
||||||
@ -14,8 +14,8 @@ noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_
|
|||||||
-> decltype(::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()`](../basic_json/get.md) function of the
|
This function is usually called by the [`get()`](../basic_json/get.md) function of the [basic_json](../basic_json)
|
||||||
[basic_json](../basic_json) class (either explicit or via conversion operators).
|
class (either explicit or via conversion operators).
|
||||||
|
|
||||||
1. This function is chosen for default-constructible value types.
|
1. This function is chosen for default-constructible value types.
|
||||||
2. This function is chosen for value types which are not default-constructible.
|
2. This function is chosen for value types which are not default-constructible.
|
||||||
@ -32,9 +32,41 @@ This function is usually called by the [`get()`](../basic_json/get.md) function
|
|||||||
|
|
||||||
Copy of the JSON value, converted to `ValueType`
|
Copy of the JSON value, converted to `ValueType`
|
||||||
|
|
||||||
!!! note
|
## Examples
|
||||||
|
|
||||||
This documentation page is a stub.
|
??? example "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.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
--8<-- "examples/from_json__default_constructible.cpp"
|
||||||
|
```
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
```json
|
||||||
|
--8<-- "examples/from_json__default_constructible.output"
|
||||||
|
```
|
||||||
|
|
||||||
|
??? example "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.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
--8<-- "examples/from_json__non_default_constructible.cpp"
|
||||||
|
```
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
```json
|
||||||
|
--8<-- "examples/from_json__non_default_constructible.output"
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
- [to_json](to_json.md)
|
||||||
|
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
|
|||||||
@ -17,9 +17,26 @@ This function is usually called by the constructors of the [basic_json](../basic
|
|||||||
`val` (in)
|
`val` (in)
|
||||||
: value to read from
|
: value to read from
|
||||||
|
|
||||||
!!! note
|
## Examples
|
||||||
|
|
||||||
This documentation page is a stub.
|
??? example
|
||||||
|
|
||||||
|
The example below shows how a `to_json` function can be implemented for a user-defined type. This function is called
|
||||||
|
by the `adl_serializer` when the constructor `basic_json(ns::person)` is called.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
--8<-- "examples/to_json.cpp"
|
||||||
|
```
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
```json
|
||||||
|
--8<-- "examples/to_json.output"
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
- [from_json](from_json.md)
|
||||||
|
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
|
|||||||
@ -19,6 +19,23 @@ using json_serializer = JSONSerializer<T, SFINAE>;
|
|||||||
|
|
||||||
The default values for `json_serializer` is [`adl_serializer`](../adl_serializer).
|
The default values for `json_serializer` is [`adl_serializer`](../adl_serializer).
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
??? example
|
||||||
|
|
||||||
|
The example below shows how a conversion of a non-default-constructible type is implemented via a specialization of
|
||||||
|
the `adl_serializer`.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
--8<-- "examples/from_json__non_default_constructible.cpp"
|
||||||
|
```
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
```json
|
||||||
|
--8<-- "examples/from_json__non_default_constructible.output"
|
||||||
|
```
|
||||||
|
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Since version 2.0.0.
|
- Since version 2.0.0.
|
||||||
|
|||||||
@ -10,7 +10,7 @@ namespace ns {
|
|||||||
std::string address;
|
std::string address;
|
||||||
int age;
|
int age;
|
||||||
};
|
};
|
||||||
}
|
} // namespace ns
|
||||||
|
|
||||||
ns::person p = {"Ned Flanders", "744 Evergreen Terrace", 60};
|
ns::person p = {"Ned Flanders", "744 Evergreen Terrace", 60};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user