mirror of
https://github.com/nlohmann/json.git
synced 2026-10-26 15:58:55 +00:00
Reformat the two UBJSON mapping tables that this PR changed (uniform column widths, padded cells), use the serial comma in lists of three or more in the added text, and restore the original type_error.321 bullet in to_ubjson.md. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
6.5 KiB
6.5 KiB
nlohmann::basic_json::from_ubjson
// (1)
template<typename InputType>
static basic_json from_ubjson(InputType&& i,
const bool strict = true,
const bool allow_exceptions = true,
const error_handler_t error_handler = error_handler_t::keep);
// (2)
template<typename IteratorType, typename SentinelType = IteratorType>
static basic_json from_ubjson(IteratorType first, SentinelType last,
const bool strict = true,
const bool allow_exceptions = true,
const error_handler_t error_handler = error_handler_t::keep);
Deserializes a given input to a JSON value using the UBJSON (Universal Binary JSON) serialization format.
- Reads from a compatible input.
- Reads from an iterator range, or an iterator and a sentinel of a different type (C++20 ranges support).
The exact mapping and its limitations are described on a dedicated page.
Template parameters
InputType- A compatible input, for instance:
- an
std::istreamobject - a
FILEpointer - a C-style array of characters
- a pointer to a null-terminated string of single byte characters
- a container
objfor whichbegin(obj)andend(obj)produce a valid pair of iterators (as found via ADL or member functions, with semantics compatible tostd::beginandstd::end)
- an
IteratorType- a compatible iterator type
SentinelType- defaults to
IteratorType; may be a different type comparable toIteratorTypeviaoperator!=, for instance.- a custom sentinel type for C++20 ranges
std::default_sentinel_t, whenIteratorTypeisstd::counted_iterator
Parameters
i(in)- an input in UBJSON format convertible to an input adapter
first(in)- iterator to the start of the input
last(in)- iterator to the end of the input, or a sentinel value that compares equal to the end iterator with
operator!= strict(in)- whether to expect the input to be consumed until EOF (
#!cpp trueby default) allow_exceptions(in)- whether to throw exceptions in case of a parse error (optional,
#!cpp trueby default) error_handler(in)- how to treat a string value or object key that is not valid UTF-8; see
error_handler_t. UBJSON does not require a decoder to reject ill-formed UTF-8, so checking is opt-in: the default,keep, does not check at all, as every binary reader did before this parameter was added;strictchecks and throws;replace/ignoresanitize the string the same waydumpwould
Return value
deserialized JSON value; in case of a parse error and allow_exceptions set to #!cpp false, the return value will be
value_t::discarded. The latter can be checked with is_discarded.
Exception safety
Strong guarantee: if an exception is thrown, there are no changes in the JSON value.
Exceptions
- Throws parse_error.110 if the given input ends prematurely or
the end of the file was not reached when
strictwas set to true - Throws parse_error.112 if an invalid type marker is read
(including a type marker after
$of an optimized container, even if its count is 0), or if$is not followed by# - Throws parse_error.113 if a string could not be parsed
successfully (negative or non-integer length,
Cfollowed by a byte above 0x7F), if the count of an optimized container is negative, or if a string value or object key is not valid UTF-8 anderror_handlerisstrict - Throws parse_error.115 if the text of a high-precision number
(
H) is not a valid JSON number - Throws out_of_range.406 if a high-precision number, or a
float64 when
number_float_tisfloat, does not fit intonumber_float_t - Throws out_of_range.408 if the count of an optimized
container exceeds the capacity of the container (or of
std::size_t), or if an optimized array ofZ,T, orFhas more than 1,048,576 elements
Complexity
Linear in the size of the input.
Examples
??? example
The example shows the deserialization of a byte vector in UBJSON format to a JSON value.
```cpp
--8<-- "examples/from_ubjson.cpp"
```
Output:
```json
--8<-- "examples/from_ubjson.output"
```
See also
- to_ubjson create a UBJSON serialization of a JSON value
- from_cbor create a JSON value from an input in CBOR format
- from_msgpack create a JSON value from an input in MessagePack format
- from_bson create a JSON value from an input in BSON format
- from_bjdata create a JSON value from an input in BJData format
- from_bon8 create a JSON value from an input in BON8 format
Version history
- Added in version 3.1.0.
- Added
allow_exceptionsparameter in version 3.2.0. - Extended container support (1) to include types with lvalue-only ADL
begin/end(matchingstd::begin/std::endsemantics) in version 3.13.0. - Extended overload (2) to accept heterogeneous iterator+sentinel pairs (C++20 ranges support) in version 3.13.0.
- Added
error_handlerparameter in version 3.13.0.
!!! warning "Deprecation"
- Overload (2) replaces calls to `from_ubjson` with a pointer and a length as first two parameters, which has been
deprecated in version 3.8.0. In version 4.0.0, this overload
will be deleted (`= delete`) rather than removed. Please replace all calls like
`#!cpp from_ubjson(ptr, len, ...);` with `#!cpp from_ubjson(ptr, ptr+len, ...);`.
- Overload (2) replaces calls to `from_ubjson` with a pair of iterators as their first parameter, which has been
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
`#!cpp from_ubjson({ptr, ptr+len}, ...);` with `#!cpp from_ubjson(ptr, ptr+len, ...);`.
You should be warned by your compiler with a `-Wdeprecated-declarations` warning if you are using a deprecated
function.
See the [migration guide](../../integration/migration_guide.md#parsing) for how to update existing code.