mirror of
https://github.com/nlohmann/json.git
synced 2026-10-25 23:38:58 +00:00
get<T>() and get_to() of a view call T's from_json() with the view itself when that from_json() accepts views but not an unrelated probe type, and fall back to materialize() otherwise. The from_json() functions of the NLOHMANN_DEFINE_TYPE_*, NLOHMANN_DEFINE_DERIVED_TYPE_* and NLOHMANN_JSON_SERIALIZE_ENUM(_STRICT) macros accept basic_json values and views; a derived type whose base reads only json reads the base part through materialize(). The library's own from_json() overloads are not called with views: from_json() of a view (and of the probe) only looks up functions by ADL. New public trait nlohmann::is_json_view<T>, and the member type basic_json_type of basic_json_view. With duplicate keys, the members of such a T are those the view's lookups find (the first ones). bench_decode.cpp measures decoding into structs (4-6x faster than materialize().get<T>() on twitter, citm_catalog, and synthetic records). Signed-off-by: Niels Lohmann <mail@nlohmann.me>
35 lines
1.0 KiB
C++
35 lines
1.0 KiB
C++
#include <iostream>
|
|
#include <type_traits>
|
|
#include <nlohmann/json_view.hpp>
|
|
|
|
using nlohmann::json;
|
|
|
|
namespace ns
|
|
{
|
|
struct person
|
|
{
|
|
std::string name;
|
|
int age = 0;
|
|
};
|
|
|
|
// reads json values and views (of any document type), but nothing else
|
|
template < typename J, typename std::enable_if < nlohmann::is_json_view<J>::value || std::is_same<J, json>::value, int >::type = 0 >
|
|
void from_json(const J& j, person& p)
|
|
{
|
|
p.name = j.at("name").template get<std::string>();
|
|
p.age = j.at("age").template get<int>();
|
|
}
|
|
} // namespace ns
|
|
|
|
int main()
|
|
{
|
|
std::cout << std::boolalpha
|
|
<< nlohmann::is_json_view<nlohmann::json_view>::value << ' '
|
|
<< nlohmann::is_json_view<nlohmann::ordered_json_editable_view>::value << ' '
|
|
<< nlohmann::is_json_view<json>::value << '\n';
|
|
|
|
const nlohmann::json_document doc = nlohmann::json_document::parse(R"({"name": "Ada", "age": 36})");
|
|
const auto p = doc.root().get<ns::person>(); // reads the view, no json value is built
|
|
std::cout << p.name << ' ' << p.age << '\n';
|
|
}
|