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>
121 lines
3.6 KiB
Markdown
121 lines
3.6 KiB
Markdown
# <small>nlohmann::basic_json::</small>items
|
|
|
|
```cpp
|
|
iteration_proxy<iterator> items() noexcept;
|
|
iteration_proxy<const_iterator> items() const noexcept;
|
|
```
|
|
|
|
This function allows accessing `iterator::key()` and `iterator::value()` during range-based for loops. In these loops, a
|
|
reference to the JSON values is returned, so there is no access to the underlying iterator.
|
|
|
|
For loop without `items()` function:
|
|
|
|
```cpp
|
|
for (auto it = j_object.begin(); it != j_object.end(); ++it)
|
|
{
|
|
std::cout << "key: " << it.key() << ", value:" << it.value() << '\n';
|
|
}
|
|
```
|
|
|
|
Range-based for loop without `items()` function:
|
|
|
|
```cpp
|
|
for (auto it : j_object)
|
|
{
|
|
// "it" is of type json::reference and has no key() member
|
|
std::cout << "value: " << it << '\n';
|
|
}
|
|
```
|
|
|
|
Range-based for loop with `items()` function:
|
|
|
|
```cpp
|
|
for (auto& el : j_object.items())
|
|
{
|
|
std::cout << "key: " << el.key() << ", value:" << el.value() << '\n';
|
|
}
|
|
```
|
|
|
|
The `items()` function also allows using
|
|
[structured bindings](https://en.cppreference.com/w/cpp/language/structured_binding) (C++17):
|
|
|
|
```cpp
|
|
for (auto& [key, val] : j_object.items())
|
|
{
|
|
std::cout << "key: " << key << ", value:" << val << '\n';
|
|
}
|
|
```
|
|
|
|
If you need to name the type of the dereferenced element explicitly (e.g., to write a standalone function that
|
|
takes it as a parameter, or to use `items()` with `std::for_each`), use `decltype`:
|
|
|
|
```cpp
|
|
using element_type = decltype(*j_object.items().begin());
|
|
```
|
|
|
|
The per-element type (`iteration_proxy_value`) lives in the library's internal `detail` namespace and is
|
|
intentionally unspecified as a stable, named type -- `decltype` is the supported way to obtain it, but its exact
|
|
name/definition may change between versions.
|
|
|
|
## Return value
|
|
|
|
iteration proxy object wrapping the current value with an interface to use in range-based for loops
|
|
|
|
## Exception safety
|
|
|
|
Strong guarantee: if an exception is thrown, there are no changes in the JSON value.
|
|
|
|
## Complexity
|
|
|
|
Constant.
|
|
|
|
## Notes
|
|
|
|
When iterating over an array, `key()` will return the index of the element as string (see example). For primitive types
|
|
(e.g., numbers), `key()` returns an empty string.
|
|
|
|
!!! danger "Lifetime issues"
|
|
|
|
Using `items()` on temporary objects is dangerous. Make sure the object's lifetime exceeds the iteration. See
|
|
[#2040](https://github.com/nlohmann/json/issues/2040) for more information.
|
|
|
|
## Examples
|
|
|
|
??? example
|
|
|
|
The following code shows an example for `items()`.
|
|
|
|
```cpp
|
|
--8<-- "examples/items.cpp"
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
--8<-- "examples/items.output"
|
|
```
|
|
|
|
## See also
|
|
|
|
- [begin](begin.md) returns an iterator to the first element
|
|
- [end](end.md) returns an iterator to one past the last element
|
|
- [basic_json_view::items](../basic_json_view/items.md) - the same range on a zero-copy view (`#!cpp const auto`,
|
|
not `#!cpp const auto&`: items are produced on the fly)
|
|
|
|
## Version history
|
|
|
|
- Added `iterator_wrapper` in version 3.0.0.
|
|
- Added `items` and deprecated `iterator_wrapper` in version 3.1.0.
|
|
- Added structured binding support in version 3.5.0.
|
|
|
|
!!! warning "Deprecation"
|
|
|
|
This function replaces the static function `iterator_wrapper` which was introduced in version 1.0.0, but has been
|
|
deprecated in version 3.1.0. Function `iterator_wrapper` will be removed in version 4.0.0. Please replace all
|
|
occurrences of `#!cpp iterator_wrapper(j)` with `#!cpp j.items()`.
|
|
|
|
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#miscellaneous-functions) for how to update existing code.
|