Give basic_json_view the read-only access functions of basic_json: operator[] and at() with keys and indices, front()/back(), find(), contains(), count(), begin()/end() and cbegin()/cend(), items() with structured bindings from C++17 on, and type_name(). Exceptions have the ids and messages of the const functions of basic_json. Where basic_json has undefined behavior the view answers safely: operator[] with a missing key or an out-of-range index returns a discarded view, and front()/back() of an empty container throw invalid_iterator.214. Objects are iterated in document order, and all members are visited; duplicate-key lookups find the first member (as yyjson and simdjson do), while parse(), materialize(), and the map conversions keep the last value, as parse() does. Keys of up to 16 bytes are compared with two overlapping loads. Add value conversions: get<T>()/get_to() for arithmetic types, bool, nullptr_t, strings (std::basic_string copied, string_view_t without a copy), BasicJsonType, views, std::vector, and maps with string keys; get_string() for the string without a copy; number_token() for the number exactly as written in the source; value() with keys and JSON pointers; and operator[]/at()/ contains() with JSON pointers. Everything else, including types with from_json(), goes through materialize() of that subtree. get<T>() of arithmetic types is inlined down to the conversion, so reading an integer needs no call. detail::json_pointer_access exposes a pointer's reference tokens to code outside basic_json. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
8.6 KiB
nlohmann::basic_json::at
// (1)
reference at(size_type idx);
const_reference at(size_type idx) const;
// (2)
reference at(const typename object_t::key_type& key);
const_reference at(const typename object_t::key_type& key) const;
// (3)
template<typename KeyType>
reference at(KeyType&& key);
template<typename KeyType>
const_reference at(KeyType&& key) const;
// (4)
reference at(const json_pointer& ptr);
const_reference at(const json_pointer& ptr) const;
- Returns a reference to the array element at specified location
idx, with bounds checking. - Returns a reference to the object element with specified key
key, with bounds checking. - See 2. This overload is only available if
KeyTypeis comparable with#!cpp typename object_t::key_typeand#!cpp typename object_comparator_t::is_transparentdenotes a type. - Returns a reference to the element at specified JSON pointer
ptr, with bounds checking.
Template parameters
KeyType- A type for an object key other than
json_pointerthat is comparable withstring_tusingobject_comparator_t. This can also be a string view (C++17).
Parameters
idx(in)- index of the element to access
key(in)- object key of the elements to access
ptr(in)- JSON pointer to the desired element
Return value
- reference to the element at index
idx - reference to the element at key
key - reference to the element at key
key - reference to the element pointed to by
ptr
Exception safety
Strong exception safety: if an exception occurs, the original value stays intact.
Exceptions
- The function can throw the following exceptions:
- Throws
type_error.304if the JSON value is not an array; in this case, callingatwith an index makes no sense. See the example below. - Throws
out_of_range.401if the indexidxis out of range of the array; that is,idx >= size(). See the example below.
- Throws
- The function can throw the following exceptions:
- Throws
type_error.304if the JSON value is not an object; in this case, callingatwith a key makes no sense. See the example below. - Throws
out_of_range.403if the keykeyis not stored in the object; that is,find(key) == end(). See the example below.
- Throws
- See 2.
- The function can throw the following exceptions:
- Throws
parse_error.106if an array index in the passed JSON pointerptrbegins with '0'. See the example below. - Throws
parse_error.109if an array index in the passed JSON pointerptris not a number. See the example below. - Throws
out_of_range.401if an array index in the passed JSON pointerptris out of range. See the example below. - Throws
out_of_range.402if the array index '-' is used in the passed JSON pointerptr. Asatprovides checked access (and no elements are implicitly inserted), the index '-' is always invalid. See the example below. - Throws
out_of_range.403if the JSON pointer describes a key of an object which cannot be found. See the example below. - Throws
out_of_range.404if the JSON pointerptrcan not be resolved. See the example below. - Throws
out_of_range.410if an array index in the passed JSON pointerptrexceeds the range ofsize_type(e.g., on 32-bit platforms).
- Throws
Complexity
- Constant.
- Logarithmic in the size of the container.
- Logarithmic in the size of the container.
- Logarithmic in the size of the container.
Notes
!!! warning "Deprecation"
Overload (4) also accepts a [`json_pointer`](../json_pointer/index.md) whose template argument is a `basic_json`
specialization (e.g., `nlohmann::json_pointer<nlohmann::json>`) instead of a string type. This is deprecated since
version 3.11.0 and will be removed in a future major version; use `basic_json::json_pointer` (for `json`,
`nlohmann::json_pointer<std::string>`) instead.
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#json-pointers) for how to update existing code.
Examples
??? example "Example: (1) access specified array element with bounds checking"
The example below shows how array elements can be read and written using `at()`. It also demonstrates the different
exceptions that can be thrown.
```cpp
--8<-- "examples/at__size_type.cpp"
```
Output:
```json
--8<-- "examples/at__size_type.output"
```
??? example "Example: (1) access specified array element with bounds checking"
The example below shows how array elements can be read using `at()`. It also demonstrates the different exceptions
that can be thrown.
```cpp
--8<-- "examples/at__size_type_const.cpp"
```
Output:
```json
--8<-- "examples/at__size_type_const.output"
```
??? example "Example: (2) access specified object element with bounds checking"
The example below shows how object elements can be read and written using `at()`. It also demonstrates the different
exceptions that can be thrown.
```cpp
--8<-- "examples/at__object_t_key_type.cpp"
```
Output:
```json
--8<-- "examples/at__object_t_key_type.output"
```
??? example "Example: (2) access specified object element with bounds checking"
The example below shows how object elements can be read using `at()`. It also demonstrates the different exceptions
that can be thrown.
```cpp
--8<-- "examples/at__object_t_key_type_const.cpp"
```
Output:
```json
--8<-- "examples/at__object_t_key_type_const.output"
```
??? example "Example: (3) access specified object element using string_view with bounds checking"
The example below shows how object elements can be read and written using `at()`. It also demonstrates the different
exceptions that can be thrown.
```cpp
--8<-- "examples/at__keytype.c++17.cpp"
```
Output:
```json
--8<-- "examples/at__keytype.c++17.output"
```
??? example "Example: (3) access specified object element using string_view with bounds checking"
The example below shows how object elements can be read using `at()`. It also demonstrates the different exceptions
that can be thrown.
```cpp
--8<-- "examples/at__keytype_const.c++17.cpp"
```
Output:
```json
--8<-- "examples/at__keytype_const.c++17.output"
```
??? example "Example: (4) access specified element via JSON Pointer"
The example below shows how object elements can be read and written using `at()`. It also demonstrates the different
exceptions that can be thrown.
```cpp
--8<-- "examples/at__json_pointer.cpp"
```
Output:
```json
--8<-- "examples/at__json_pointer.output"
```
??? example "Example: (4) access specified element via JSON Pointer"
The example below shows how object elements can be read using `at()`. It also demonstrates the different exceptions
that can be thrown.
```cpp
--8<-- "examples/at__json_pointer_const.cpp"
```
Output:
```json
--8<-- "examples/at__json_pointer_const.output"
```
See also
- documentation on checked access
operator[]for unchecked access by referencevaluefor access with default value- basic_json_view::at - the same access on a zero-copy view
Version history
- Added in version 1.0.0.
- Added in version 1.0.0.
- Added in version 3.11.0. Fixed in version 3.13.0 to consistently accept
std::string_view-convertible keys, as already supported byoperator[],value,find, and other lookup functions. - Added in version 2.0.0.