mirror of
https://github.com/nlohmann/json.git
synced 2026-10-12 11:55:18 +00:00
basic_json_document gets a second template parameter, Editable (false by default), plus the aliases json_editable_document, json_editable_view, ordered_json_editable_document and ordered_json_editable_view. Editable documents can change values and structure without rewriting the source text: set()/push_back() on values, keys, array indices and JSON pointers; insert() before an array element; erase() of an object key, array index or JSON pointer. New values and element sequences go into edit storage that the document owns and never moves, so views keep referring to their value across edits and a parsed node never moves. Read-only documents walk the plain node array and are unaffected. Strings are checked for UTF-8 on entry, so dump() of an editable document never throws type_error.316. Binary values cannot be stored (type_error.319). A seeded differential test applies random edits to an editable document and to the equivalent ordered_json and compares both after every step. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
42 lines
1.6 KiB
C++
42 lines
1.6 KiB
C++
#include <iostream>
|
|
#include <nlohmann/json_view.hpp>
|
|
|
|
using json = nlohmann::json;
|
|
using json_editable_document = nlohmann::json_editable_document;
|
|
using json_editable_view = nlohmann::json_editable_view;
|
|
|
|
int main()
|
|
{
|
|
// a configuration file, as it might be read from disk -- "price" is
|
|
// written with a trailing zero that has no effect on its value
|
|
const std::string text = R"({
|
|
"name": "cache",
|
|
"host": "db1",
|
|
"port": 6379,
|
|
"price": 19.90,
|
|
"replicas": ["db2", "db3"],
|
|
"timeout": 30
|
|
})";
|
|
|
|
json_editable_document doc = json_editable_document::parse(text);
|
|
|
|
doc.set(doc.root()["port"], 6380); // (1) replace a value
|
|
doc.set(doc.root(), "region", "us-east"); // (2) add a member
|
|
doc.set(doc.root()["replicas"], 0, "db4"); // (3) assign an element
|
|
doc.set(json::json_pointer("/timeout"), 45); // (4) via a JSON pointer
|
|
|
|
// members stay in document order (the new one at the end), and a number
|
|
// that was not itself edited keeps its exact spelling
|
|
std::cout << doc.root().dump(2, ' ', false, json_editable_view::number_format::source) << "\n\n";
|
|
|
|
// the same edits on a plain json value: object_t is a std::map, so
|
|
// parsing already sorted the keys, and dump() rewrites every number to
|
|
// its shortest form, even "price", which was never touched
|
|
json plain = json::parse(text);
|
|
plain["port"] = 6380;
|
|
plain["region"] = "us-east";
|
|
plain["replicas"][0] = "db4";
|
|
plain[json::json_pointer("/timeout")] = 45;
|
|
std::cout << plain.dump(2) << '\n';
|
|
}
|