mirror of
https://github.com/nlohmann/json.git
synced 2026-10-10 16:37:14 +00:00
Looking up the last member of a duplicate key cannot stop at a match, so every lookup scanned the whole object (1.6 to 3.4 times slower for small objects). operator[](key), at, find, value, contains, count, and JSON pointer resolution return the first member again, as yyjson and simdjson do; materialize() and get<map>() keep the last value, as parse(). The documentation says so in the feature page and on each lookup page, and explains how to get the value parse() would give. The integer index templates and the discarded chaining of operator[] stay. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
23 lines
932 B
C++
23 lines
932 B
C++
#include <iostream>
|
|
#include <nlohmann/json_view.hpp>
|
|
|
|
using json_document = nlohmann::json_document;
|
|
|
|
int main()
|
|
{
|
|
// a settings object whose source text records every update to a key as
|
|
// a duplicate member. items() visits all of them, in document order, so
|
|
// the update history is visible; operator[] only ever sees the first
|
|
// one, and materialize() -- like basic_json::parse() -- keeps the last
|
|
json_document updates = json_document::parse(R"({"retries": 1, "timeout": 30, "retries": 5})");
|
|
const auto settings = updates.root();
|
|
|
|
for (const auto& item : settings.items())
|
|
{
|
|
std::cout << item.key() << '=' << item.value().materialize().dump() << '\n';
|
|
}
|
|
|
|
std::cout << "first \"retries\" seen by operator[]: " << settings["retries"].materialize().dump() << '\n';
|
|
std::cout << "last \"retries\" kept by materialize(): " << settings.materialize()["retries"].dump() << '\n';
|
|
}
|