mirror of
https://github.com/nlohmann/json.git
synced 2026-09-30 22:15:19 +00:00
* Name the key type when rejecting non-string CBOR/MessagePack map keys CBOR and MessagePack allow map keys of any type, but JSON object keys are always strings, so such maps are rejected. The error so far was the one for a malformed string (e.g. "expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0xC0" for a nil key), which does not tell the user what went wrong. Report the type of the key instead: syntax error while parsing MessagePack object key: only string keys are supported, but found nil; last byte: 0xC0 The exception id (parse_error.113) and type are unchanged. Malformed string keys and a missing key keep their previous messages. Document the restriction on the CBOR and MessagePack pages. Refs #2766, #3381 Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Point the MessagePack key note to the spec's profile section The note linked to "Serialization: type to format conversion", which says nothing about key types. Restricting map keys to strings is only mentioned in the "Profile" section (under "Future discussion") as an example of a JSON-compatible profile, so link there and describe it as such instead of as a permission. Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
5.4 KiB
5.4 KiB
nlohmann::basic_json::from_cbor
// (1)
template<typename InputType>
static basic_json from_cbor(InputType&& i,
const bool strict = true,
const bool allow_exceptions = true,
const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error);
// (2)
template<typename IteratorType, typename SentinelType = IteratorType>
static basic_json from_cbor(IteratorType first, SentinelType last,
const bool strict = true,
const bool allow_exceptions = true,
const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error);
Deserializes a given input to a JSON value using the CBOR (Concise Binary Object Representation) 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 CBOR 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) tag_handler(in)- how to treat CBOR tags (optional,
errorby default); seecbor_tag_handler_tfor more information
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 unsupported features from CBOR were used in the given input or if the input is not valid CBOR
- Throws parse_error.113 if a map key is not a string (keys of other types are not supported, as JSON object keys are always strings) or a string is malformed
Complexity
Linear in the size of the input.
Examples
??? example
The example shows the deserialization of a byte vector in CBOR format to a JSON value.
```cpp
--8<-- "examples/from_cbor.cpp"
```
Output:
```json
--8<-- "examples/from_cbor.output"
```
See also
- to_cbor create a CBOR serialization of a JSON value
- 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_ubjson create a JSON value from an input in UBJSON 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 2.0.9.
- Parameter
start_indexsince version 2.1.1. - Changed to consume input adapters, removed
start_indexparameter, and addedstrictparameter in version 3.0.0. - Added
allow_exceptionsparameter in version 3.2.0. - Added
tag_handlerparameter in version 3.9.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.
!!! warning "Deprecation"
- Overload (2) replaces calls to `from_cbor` with a pointer and a length as first two parameters, 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_cbor(ptr, len, ...);` with `#!cpp from_cbor(ptr, ptr+len, ...);`.
- Overload (2) replaces calls to `from_cbor` 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_cbor({ptr, ptr+len}, ...);` with `#!cpp from_cbor(ptr, ptr+len, ...);`.
You should be warned by your compiler with a `-Wdeprecated-declarations` warning if you are using a deprecated
function.