Defined in header <nlohmann/json_view.hpp>
template<typename BasicJsonType, bool Editable = false> class basic_json_document;
A parsed JSON text, held as a flat index of its values (16 bytes per value) instead of a tree of BasicJsonType values. Strings and numbers stay in the source text; only strings that contain escapes are decoded, into one buffer owned by the document. basic_json_view is a read-only handle to one value of a basic_json_document; materialize() turns a subtree into the BasicJsonType value that BasicJsonType::parse() would have produced for it.
A document may borrow the text it was parsed from (the caller's buffer must then outlive the document) or own it (a copy, or an rvalue #!cpp std::string that was moved in); see owns_source. basic_json_document is move-only: a copy would duplicate the whole index, the decoded-string buffer, and the owned text, and a move is enough in every use we know of. The index, the decoded strings, and the owned text live in one heap block that the document holds through a #!cpp std::unique_ptr; this is also why views survive a move of the document.
With #!cpp Editable == true, the document also offers set, push_back, insert, and erase to change values in place, see Edits below. The source text itself is never written; a read-only document (#!cpp Editable == false, the default) does not carry any of the bookkeeping edits need, and calling any of them on one fails to compile (#!cpp static_assert).
BasicJsonType : a specialization of basic_json, for instance json or ordered_json. Only 64-bit number_integer_t/number_unsigned_t types are supported; this is checked with a static_assert.
Editable : whether the document supports set, push_back, insert, and erase (optional, #!cpp false by default). See Edits below.
jsonordered_jsonjsonordered_jsonroot() (#!cpp basic_json_view<BasicJsonType, Editable>)basic_json::value_tload() validates an image (full, bounds, none), see image_checkload() reads without parsingsave()#!cpp Editable documents only)#!cpp Editable documents only)#!cpp Editable documents only)#!cpp Editable documents only)An editable document (#!cpp Editable == true) can be changed after parsing, with set, push_back, insert, and erase; json_editable_document and ordered_json_editable_document are the corresponding specializations. A few points apply to every edit:
root(). New values (and the element sequences of an edited array/object) go to storage owned by the document, allocated on demand.set replaces the value a view refers to, that view sees the new value; a view of a value that a later edit replaces or drops keeps showing what it last held. An edit of an array or object, however, invalidates the iterators taken over it (its members may now live in a different sequence), and a string obtained with get_string() stays valid even as further edits happen (earlier buffers of edited text are kept alive, not overwritten).basic_json_view of any document (read-only or editable; it is copied, nothing is shared with the source document), a BasicJsonType value, or anything BasicJsonType can be constructed from (numbers, strings, #!cpp bool, #!cpp nullptr, containers, ...).dump() writes an edited document with members in document order, new members at the end, and, with number_format::source, keeps the spelling of every number that was not itself edited -- see Editing a document for why this matters.read() discards all edits, shrink_to_fit() does not move the node index once there are edits, and memory_usage() includes the memory edits use. source_offset() of a value introduced by an edit is #!cpp static_cast<std::size_t>(-1), the same value it reports for a decoded string.basic_json value from a view