* Docs: fill documentation gaps found in user questions Add pages on class-hierarchy/smart-pointer/variant/chrono recipes, working without exceptions, and large, streamed and partial input. Extend the FAQ (23 entries, Known bugs first), parse error documentation (empty-input checklist, line/column, diagnostic positions), element access, conversions, creating values, ADL troubleshooting, memory, and build/distribution notes. Add 14 examples with generated output. Correct the statement that parse errors cannot be recovered from with -fno-exceptions. The topics come from recurring questions on Stack Overflow, Reddit, Hacker News, YouTube, and the project's GitHub discussions and issues. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: declare range-for lists in variables to keep astyle quiet astyle reformats a braced init list placed directly in a range-for header; declare the list first so check_amalgamation passes. Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
49 lines
1004 B
C++
49 lines
1004 B
C++
#include <iostream>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <nlohmann/json.hpp>
|
|
|
|
using json = nlohmann::json;
|
|
|
|
struct person
|
|
{
|
|
std::string name;
|
|
int age;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(person, name, age)
|
|
|
|
// Compile this function with exceptions enabled and call it from code that does not use them.
|
|
std::optional<person> to_person(const json& j)
|
|
{
|
|
try
|
|
{
|
|
return j.get<person>();
|
|
}
|
|
catch (const json::exception&)
|
|
{
|
|
return std::nullopt;
|
|
}
|
|
}
|
|
|
|
int main()
|
|
{
|
|
const json good = {{"name", "Mary"}, {"age", 42}};
|
|
const json bad = {{"name", "Mary"}, {"age", "forty-two"}};
|
|
const json incomplete = {{"name", "Mary"}};
|
|
|
|
const auto inputs = {good, bad, incomplete};
|
|
|
|
for (const json& j : inputs)
|
|
{
|
|
if (const auto p = to_person(j))
|
|
{
|
|
std::cout << "person: " << p->name << ", " << p->age << '\n';
|
|
}
|
|
else
|
|
{
|
|
std::cout << "not a person: " << j << '\n';
|
|
}
|
|
}
|
|
}
|