* docs: new design for the documentation site Apply the brand to the Material for MkDocs site: Inter and JetBrains Mono served by the site (upright and real italic), brand colours, blue header band with the syntax pattern, wordmark in the header, new home page (hero, cards, animated feature tour), 404 page, polish for tabs, search, footer, focus rings, tables and code blocks, and theme features (code copy, previous/next footer, TOC follow, search suggestions). Draw the number railroad diagram, the parser callback events and the iterator illustrations as inline SVGs that follow the light and dark scheme. The generator scripts are in docs/mkdocs/scripts/figures; the feature slideshow (json-light.svg, json-dark.svg, replacing json.gif on the home page) is built by docs/mkdocs/scripts/slideshow. Decision nodes in five flowcharts become hexagons, which need far less room. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: add figures, table captions and a macro chooser - Figures with numbered captions: SAX stepper, json_view layout and edit stepper, exception map, JSON pointer and patch walkers, QA pipeline, scaling and binary size charts, roadmap lanes, release timeline, integration decision tree and namespace builder - Table captions (nj-table-caption) on 9 pages - Compile times: modules and PCH charts, filesystem section, re-measured Figure 1, links between features/modules.md and compile_times.md - Interactive macro chooser for features/arbitrary_types.md - Link check: exclude URLs that answer the plugin with 400/401/419 or are dead (customers.md) Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: macro chooser generates adl_serializer for non-default-constructible types Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: cross-link concept pages and API pages in See also sections Add See also links in both directions between the concept pages (features, home, integration) and the API pages, write API links in code font, give every entry a comment after a dash, and show the callback event figure on the parser callbacks page. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: address review comments on the new design - Home: add a "Latest release" button - Sponsors: update the list and group it by tier - Features: list all feature pages on the index page - Releases: add highlights per release, link the 4.0 roadmap, add the first commit to the timeline - Exceptions: prefix all example messages with the exception name - API: no code font for format names in the See also links of the to_/from_ pages - Merge Patch: show the document before, the patch, and the result - Replace "--" with typographic dashes, mark external links with an icon, center Mermaid diagrams Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
8.2 KiB
nlohmann::basic_json_document::parse
// (1)
template<typename InputType>
static basic_json_document parse(InputType&& input,
const bool allow_exceptions = true,
const bool ignore_comments = false,
const bool ignore_trailing_commas = false);
// (2)
template<typename IteratorType>
static basic_json_document parse(IteratorType first, IteratorType last,
const bool allow_exceptions = true,
const bool ignore_comments = false,
const bool ignore_trailing_commas = false);
- Deserialize from a compatible input, borrowing or owning it depending on its value category and type (see Notes).
- Deserialize from a pair of input iterators.
Both overloads accept the same JSON text as BasicJsonType::parse(), with the same
ignore_comments/ignore_trailing_commas options, but build a basic_json_document (a flat index into
the input) instead of a tree of BasicJsonType values. They accept every input BasicJsonType::parse() takes, and in
addition a pointer to a null-terminated wide string (which BasicJsonType::parse() rejects). Contiguous inputs of
single-byte characters that stay alive can be borrowed; all others (streams, #!cpp FILE*, wide characters, which
must be converted to UTF-8, and non-contiguous iterators) are read into a copy that the document owns — see the
Notes. Use parse_copy() to get an owned copy of a borrowable input
as well.
Template parameters
InputType- A compatible input, for instance:
- a
#!cpp std::string, a#!cpp std::string_view(C++17), or a C-style array of single-byte characters - a pointer to a null-terminated string of single-byte characters (
#!cpp char,#!cpp signed char,#!cpp unsigned char,#!cpp std::uint8_t) - a container for which
#!cpp obj.data()and#!cpp obj.size()give contiguous single-byte access, e.g.#!cpp std::vector<char>or#!cpp std::vector<std::uint8_t> - an
#!cpp std::istreamobject - a
#!cpp FILE*pointer - wide characters (
#!cpp wchar_t,#!cpp char16_t,#!cpp char32_t), which are converted to UTF-8: a wide string object (#!cpp std::wstring,#!cpp std::u16string,#!cpp std::u32string), an array (e.g. a wide string literal), or a pointer to a null-terminated wide string
- a
IteratorType- an input iterator type, for instance a pair of pointers such as
ptrandptr + len, or a pair of#!cpp std::string::iterator; the iterators of single-byte characters are borrowed or read like the byte inputs above, those of wide characters are converted to UTF-8
Ill-formed UTF-16 and UTF-32 sequences are rejected: a lone surrogate, a high surrogate that is not followed by its low
surrogate, and a code point above U+10FFFF all yield a
parse_error.101.
Parameters
input(in)- Input to parse from.
allow_exceptions(in)- whether to throw exceptions in case of a parse error (optional,
#!cpp trueby default) ignore_comments(in)- whether comments should be ignored and treated like whitespace (
#!cpp true) or yield a parse error (#!cpp false); (optional,#!cpp falseby default) ignore_trailing_commas(in)- whether trailing commas in arrays or objects should be ignored and treated like whitespace (
#!cpp true) or yield a parse error (#!cpp false); (optional,#!cpp falseby default) first(in)- iterator to the start of a character range
last(in)- iterator to the end of a character range
Return value
The parsed document. If allow_exceptions is #!cpp false and the input is not valid JSON, the returned document is
discarded; see is_discarded.
Exceptions
Throws the same exception BasicJsonType::parse() throws for the same input and options —
the same exception id, message, and position — because on a failing input the library's own parser is run on the
same bytes to produce the diagnostic. This replay runs only for a failing input, and costs about a lexing pass up to
the error (its SAX handler builds no values); with allow_exceptions set to #!cpp false, it is skipped and a
discarded document is returned instead. Additionally throws
out_of_range.416 if the input is 4294967280 bytes (4 GiB
minus 16 bytes) or larger, a size BasicJsonType::parse() does not reject.
Complexity
Linear in the length of the input.
Notes
Ownership. Whether the document borrows input or owns a copy of it depends on its value category and type:
input |
ownership |
|---|---|
lvalue byte container (std::string, std::vector<char>, ...), std::string_view, C string, character array |
borrowed — input must outlive the document |
non-const rvalue #!cpp std::string |
owned, moved in without a copy |
other rvalue byte container (including a #!cpp const rvalue #!cpp std::string) |
owned, copied |
stream, #!cpp FILE*, wide characters, or anything else read through the general input adapter |
owned, read into a buffer (a stream is read to its end) |
For overload (2), a pair of pointers to single-byte integers (e.g. #!cpp const char*, #!cpp std::uint8_t*) is
borrowed. From C++20 on, so is any other contiguous iterator over single bytes, such as
#!cpp std::vector<char>::iterator or #!cpp std::string::const_iterator. Before C++20 these iterators cannot be
told apart from other class-type iterators, so their range is read into an owned buffer, as is any non-contiguous
range (e.g. of a #!cpp std::list<char>).
See owns_source to check which happened after a call, and the
feature page for the reasoning.
Numbers. As for BasicJsonType::parse(), an integer literal too large for the 64-bit
integer type becomes a floating-point value.
No lengths. An integer argument that is not a #!cpp bool where the flags are expected — for example
#!cpp parse(ptr, len) — does not compile (the overload is deleted). Such a call would convert len to
allow_exceptions and read ptr as a null-terminated string, past the end of a buffer that has none. To parse a
buffer of a given length, pass a pair of pointers: #!cpp parse(ptr, ptr + len). The same holds for
parse_copy, accept, and read.
Examples
??? example "Example: (1) borrowed vs. owned input, and errors identical to BasicJsonType::parse()"
```cpp
--8<-- "examples/basic_json_document__parse.cpp"
```
Output:
```json
--8<-- "examples/basic_json_document__parse.output"
```
??? example "Example: (2) parse an iterator range (no NUL terminator required)"
```cpp
--8<-- "examples/basic_json_document__parse_iterator_pair.cpp"
```
Output:
```json
--8<-- "examples/basic_json_document__parse_iterator_pair.output"
```
See also
parse_copy- deserialize a copy of a compatible inputaccept- check whether the input is valid JSONread- (re-)parse into this document, reusing its memoryowns_source- return whether the document holds its own copy of the textload- read a document from an image instead of parsing JSON textBasicJsonType::parse- the corresponding function ofbasic_json
Version history
- Added in version 3.13.0.
- Ill-formed UTF-16 and UTF-32 input (a lone surrogate, a high surrogate that is not followed by its low surrogate, or
a code point above
U+10FFFF) is rejected withparse_error.101.