* Lookups (operator[], at, find, contains, count, value, JSON pointers) return the last member of a duplicate key, as materialize() and parse() keep it. * operator[] on a discarded view returns a discarded view instead of throwing, so v["a"]["b"] is safe for a missing "a". * operator[] and at() take any integer type (not only int and size_t), fixing ambiguous calls with unsigned, long, std::int64_t, ... * Fix the operator[] documentation, which claimed a discarded view for a type mismatch where type_error.305 is thrown. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
5.5 KiB
nlohmann::basic_json_view::value
// (1)
template<typename T>
T value(string_view_t key, const T& default_value) const;
string_t value(string_view_t key, const char* default_value) const;
// (2)
template<typename T>
T value(const json_pointer& ptr, const T& default_value) const;
string_t value(const json_pointer& ptr, const char* default_value) const;
- Returns the value of the object member with key
key-- the last one, should the key occur more than once (see Notes on duplicate keys) -- converted toT, ordefault_valueif there is no such member. - Returns the value a JSON pointer
ptrrefers to, starting at this value, converted toT, ordefault_valueifptrcannot be resolved.
Both overloads have a dedicated #!cpp const char* overload, so #!cpp v.value(key, "default") (and the JSON pointer
equivalent) deduce string_t, not const char*, for their return type and for the comparison used to pick between
key and default_value.
Template parameters
T- the type to convert the found value to; also the type of
default_value
Parameters
key(in)- object key of the element to access
ptr(in)- JSON pointer to the element to access
default_value(in)- the value to return if
key/ptrresolves to no value
Return value
- the last member with key
key, converted toT, ordefault_value - the value
ptrresolves to, converted toT, ordefault_value
Exception safety
Strong exception safety: if an exception is thrown, there are no changes to the view or the document it refers to.
Exceptions
- Throws
type_error.306if the value is not an object -- the same exception, with the same message, thatBasicJsonType::valuethrows for the same call. If a member with keykeyis found, throws whatever converting it toTthrows (typicallytype_error.302, with the same messageBasicJsonType::valuethrows for the same mismatch); a missing member never throws. - Throws
type_error.306if this value -- not the valueptrresolves to -- is neither an object nor an array. Throwsparse_error.106orparse_error.109ifptrcontains a malformed array index. Ifptrresolves to a value, throws whatever converting it toTthrows. Every other wayptrcan fail to resolve -- a missing key, an out-of-range or "-" array index, an unresolvable token on a primitive -- yieldsdefault_valueinstead of throwing, exactly asBasicJsonType::valuecatchesout_of_rangeand returnsdefault_value.
None of these exceptions carry a JSON_DIAGNOSTICS path: the view has no
BasicJsonType value to point at, so the exception is created without one, even if BasicJsonType was built with
JSON_DIAGNOSTICS enabled.
Complexity
- Linear in the number of members: as for
operator[], members are compared one after another, in document order, scanning all of them, since the last match is wanted. Plus the complexity of converting the found member toT(seeget). - Linear in the number of reference tokens of
ptrand, for each token, in the number of members of the object at that level or the index into the array -- as for theoperator[]andatoverloads that take a JSON pointer. Plus the complexity of converting the resolved value toT.
Notes
!!! info "Differences to at and operator[]"
Unlike [`at`](at.md), this function does not throw if `key`/`ptr` resolves to no value. Unlike
[`operator[]`](operator[].md), it never returns a [discarded](is_discarded.md) view -- it always returns a `T` --
and it is available on any view, since it never needs to insert a missing element the way the non-const
`BasicJsonType::operator[]` would.
!!! info "Which values can be asked"
As for [`BasicJsonType::value`](../basic_json/value.md), the key overload (1) requires an object, and the JSON
pointer overload (2) an object or an array.
Examples
??? example "Example: (1) access specified object element with default value"
The example below reads a couple of optional configuration fields with a default, so that a missing key never
needs a `#!cpp try`/`#!cpp catch` of its own.
```cpp
--8<-- "examples/basic_json_view__value.cpp"
```
Output:
```json
--8<-- "examples/basic_json_view__value.output"
```
??? example "Example: (2) access specified element via JSON pointer with default value"
The example below reads an optional, nested configuration value with a default, given as a JSON pointer.
```cpp
--8<-- "examples/basic_json_view__value_json_pointer.cpp"
```
Output:
```json
--8<-- "examples/basic_json_view__value_json_pointer.output"
```
See also
- at - access specified element with bounds checking (throws instead of returning a default value)
- operator[] - access specified element (returns a discarded view instead of a default value)
BasicJsonType::value- the corresponding function ofbasic_json
Version history
- Added in version 3.13.0.