With JSON_DIAGNOSTICS and JSON_DIAGNOSTIC_POSITIONS, the exceptions of views now carry the same context as those of basic_json: "(/path) " and "(bytes a-b) " in front of the message, in basic_json's format (with JSON_DIAGNOSTICS, no context for the root). Before, views threw without any context, and since get<T>() reads the view directly, conversions had lost even the relative path they used to get through materialize(). The throw helpers of detail/view/errors.hpp take an error_site (document and node; empty without the two macros). Only on the error path, the path is found by descending from the root (pruned by subtree extent before the first edit, a full walk through edited sequences after), and the bytes as materialize() sets them (position_source; a container's end by following the chain of last elements and scanning to the closing brackets). from_json() for views and the strict enum macro put the same context in front through exception_prefix(). Iterators keep their container only under the two macros, for key(). Without the macros, the accessors compile to the same code as before. Tests compare every value's exceptions with those of the parsed or materialized basic_json value, including edited documents; the checks that were disabled under the two macros run again. 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 (where 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.