* Split the json_view feature page into sub-pages
The single features/json_view.md page grew to ~600 lines covering eight
topics. Split it into features/json_view/ with an overview page and
pages for ownership and lifetime, differences from basic_json, reading
values, generic code, editing, and images.
The new differences page collects what was spread over several sections
("What is the same", "What is different", "Duplicate keys", and notes in
the conversion and serialization sections) under one summary table, and
adds the parts of the basic_json interface a view does not have. The
other pages now link to it instead of restating the rules.
Internal links across the documentation point to the new pages.
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
* Docs: fix stale comments and trim repeated text in json_view pages
- fig-jsonview.js/.css: point the header comments at the new pages
- reading.md: views' strings are valid as long as the document (and a
borrowed source text), as lifetime.md says
- reading.md, generic_code.md: link to differences.md instead of
restating the member-order and repeated-key rules
- differences.md: drop the third mention of ordering comparisons, name
rbegin()/rend() in the iterator row
- exceptions.md: link editable documents to editing.md
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
---------
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
3.2 KiB
nlohmann::basic_json_view::number_token
string_view_t number_token() const;
Returns the number exactly as it appears in the source text, without parsing or rounding it.
Return value
The number's token text, as a string_view_t into the document's
source() text — for example #!cpp "1.50", #!cpp "1E2", #!cpp "-0", or an
integer literal with more digits than any number type holds (such as a 30-digit integer, which get<T>()
and materialize() can only represent approximately, as a number_float_t).
Exception safety
Strong guarantee: there are no changes to the view or the document it refers to.
Exceptions
Throws type_error.302 if the value is not a number; example:
"type must be number, but is string".
As for BasicJsonType, with JSON_DIAGNOSTICS the exception names the JSON Pointer
path of the value within the document, and with JSON_DIAGNOSTIC_POSITIONS
its bytes in the source text (when materialize() sets them).
Complexity
Constant.
Notes
BasicJsonType has no counterpart to this function: once a number is parsed into number_integer_t,
number_unsigned_t, or number_float_t, its original textual form (leading zeros aside, which are already rejected
by the grammar; trailing zeros in the fraction; the case and sign of the exponent; ...) is gone. number_token() is
useful precisely where that form must survive — a price or an identifier that must be reproduced exactly, or a
number too large for any of BasicJsonType's number types to hold without loss.
The returned string_view_t always points into the document's
source() text — numbers are never decoded into the document's separate string
buffer — and is valid exactly as long as that text is, see the validity rules of basic_json_view.
Examples
??? example
The example below keeps a price and an order ID exactly as they were written in an incoming order, where
converting them with [`get<T>()`](get.md) would lose information: the price picks up floating-point rounding, and
the order ID — more digits than a 64-bit integer holds — can only be approximated as a `#!cpp double` once
`#!cpp materialize()`d.
```cpp
--8<-- "examples/basic_json_view__number_token.cpp"
```
Output:
```json
--8<-- "examples/basic_json_view__number_token.output"
```
See also
get- convert the value to a given typeget_string- the string, without a copyBasicJsonType::number_integer_t,number_unsigned_t,number_float_t- the number types#!cpp get<T>()andmaterialize()convert into- Zero-copy JSON views - reading a number exactly as written
Version history
- Added in version 3.13.0.