mirror of
https://github.com/nlohmann/json.git
synced 2026-10-21 21:48:14 +00:00
186 lines
6.1 KiB
Markdown
186 lines
6.1 KiB
Markdown
# <small>nlohmann::basic_json_view::</small>contains
|
|
|
|
```cpp
|
|
// (1)
|
|
bool contains(string_view_t key) const;
|
|
bool contains(const char* key) const;
|
|
bool contains(const string_t& key) const;
|
|
|
|
// (2)
|
|
bool contains(const json_pointer& ptr) const;
|
|
```
|
|
|
|
1. Checks whether the value is an object with a member with key `key`.
|
|
2. Checks whether a JSON pointer `ptr` can be resolved, starting at this value.
|
|
|
|
## Parameters
|
|
|
|
`key` (in)
|
|
: key value to check its existence
|
|
|
|
`ptr` (in)
|
|
: JSON pointer to check its existence
|
|
|
|
## Return value
|
|
|
|
1. `#!cpp true` if the value is an object and has a member with key `key`, `#!cpp false` otherwise
|
|
2. `#!cpp true` if `ptr` can be resolved to a value starting at this view, `#!cpp false` otherwise
|
|
|
|
## Exception safety
|
|
|
|
No-throw guarantee: this function never throws exceptions.
|
|
|
|
## Complexity
|
|
|
|
1. Linear in the number of members: as for [`ordered_json`](../ordered_json.md), members are compared one after
|
|
another, in document order, stopping at the first match. Each comparison first checks the
|
|
key's length -- already known from the index, without reading the key bytes -- before comparing its content.
|
|
Objects with 128 or more members get a hash index of their keys while parsing, so that a lookup in them takes
|
|
constant time on average.
|
|
2. Linear in the number of reference tokens of `ptr` and, for each token, in the number of members of the object at
|
|
that level or the index into the array -- as for [`operator[]`](operator[].md#complexity) and
|
|
[`at`](at.md#complexity) with a JSON pointer.
|
|
|
|
## Notes
|
|
|
|
!!! warning "Duplicate keys: the first member wins"
|
|
|
|
If the source text repeats a key, this resolves to the *first* member with it, not to the last one that
|
|
[`materialize()`](materialize.md) and `parse()` keep. See the [Notes on duplicate keys](operator[].md#notes) of
|
|
`operator[]` and [Duplicate keys](../../features/json_view.md#duplicate-keys) for the reasons and for how to get
|
|
the last value.
|
|
|
|
Overload 1 always returns `#!cpp false` when the value is not an object -- including a [discarded](is_discarded.md)
|
|
view.
|
|
|
|
!!! info "Postconditions"
|
|
|
|
If `#!cpp v.contains(key)` returns `#!cpp true`, then `#!cpp v[key]` is not [discarded](is_discarded.md) and
|
|
`#!cpp v.at(key)` does not throw. If
|
|
`#!cpp v.contains(ptr)` returns `#!cpp true`, then `#!cpp v[ptr]` is not discarded and `#!cpp v.at(ptr)` does not
|
|
throw.
|
|
|
|
!!! info "Overload 2 never throws"
|
|
|
|
Unlike [`BasicJsonType::contains(const json_pointer&)`](../basic_json/contains.md), which can throw for certain
|
|
malformed pointers (for instance an empty array-index reference token), overload 2 never throws: a missing key,
|
|
an out-of-range or malformed array index, a `#!cpp "-"` index, or a reference token used on a primitive all
|
|
simply make it return `#!cpp false`.
|
|
|
|
## Examples
|
|
|
|
??? example "Example: (1) check with key"
|
|
|
|
The example below counts how many of a batch of records carry an optional `retry_of` field, using `contains()`
|
|
to check without ever materializing a single record of the batch.
|
|
|
|
```cpp
|
|
#include <iostream>
|
|
#include <nlohmann/json_view.hpp>
|
|
|
|
using json_document = nlohmann::json_document;
|
|
|
|
int main()
|
|
{
|
|
// count how many of many incoming records carry an optional "retry_of"
|
|
// field -- contains() only walks the flat index, so scanning a large
|
|
// batch like this never builds a single nlohmann::json value
|
|
json_document batch = json_document::parse(R"(
|
|
[
|
|
{"id": 1},
|
|
{"id": 2, "retry_of": 1},
|
|
{"id": 3},
|
|
{"id": 4, "retry_of": 3}
|
|
]
|
|
)");
|
|
|
|
const auto records = batch.root();
|
|
std::size_t retries = 0;
|
|
for (std::size_t i = 0; i < records.size(); ++i)
|
|
{
|
|
if (records[i].contains("retry_of"))
|
|
{
|
|
++retries;
|
|
}
|
|
}
|
|
std::cout << retries << " of " << records.size() << " records are retries\n";
|
|
}
|
|
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
2 of 4 records are retries
|
|
|
|
```
|
|
|
|
??? example "Example: (2) check with JSON pointer"
|
|
|
|
The example below checks an optional, nested field with a JSON pointer, and shows two pointers that
|
|
`#!cpp contains()` resolves to `#!cpp false` without throwing.
|
|
|
|
```cpp
|
|
#include <iostream>
|
|
#include <nlohmann/json_view.hpp>
|
|
|
|
using json_document = nlohmann::json_document;
|
|
using json_pointer = nlohmann::json::json_pointer;
|
|
|
|
int main()
|
|
{
|
|
// "retry_of" is only present on some records, nested a level down
|
|
// inside "meta"
|
|
json_document batch = json_document::parse(R"(
|
|
[
|
|
{"id": 1, "meta": {}},
|
|
{"id": 2, "meta": {"retry_of": 1}}
|
|
]
|
|
)");
|
|
|
|
const auto records = batch.root();
|
|
const json_pointer retry_of("/meta/retry_of");
|
|
for (std::size_t i = 0; i < records.size(); ++i)
|
|
{
|
|
const auto record = records[i];
|
|
if (record.contains(retry_of))
|
|
{
|
|
std::cout << "record " << i << " is a retry of " << record[retry_of].get<int>() << '\n';
|
|
}
|
|
else
|
|
{
|
|
std::cout << "record " << i << " is original\n";
|
|
}
|
|
}
|
|
|
|
// contains() with a JSON pointer never throws -- not even for a
|
|
// pointer that indexes into a primitive ("/0/id/x") or uses a
|
|
// malformed array index ("/01"), either of which would need a
|
|
// try/catch with json::contains(ptr)
|
|
std::cout << std::boolalpha << records.contains(json_pointer("/0/id/x")) << '\n';
|
|
std::cout << std::boolalpha << records.contains(json_pointer("/01")) << '\n';
|
|
}
|
|
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
record 0 is original
|
|
record 1 is a retry of 1
|
|
false
|
|
false
|
|
|
|
```
|
|
|
|
## See also
|
|
|
|
- [find](find.md) - find a value in an object
|
|
- [count](count.md) - returns the number of occurrences of a key
|
|
- [at](at.md), [operator[]](operator[].md) - resolve a JSON pointer and throw, or return a discarded view
|
|
- [`BasicJsonType::contains`](../basic_json/contains.md) - the corresponding function of `basic_json`
|
|
|
|
## Version history
|
|
|
|
- Added in version 3.13.0.
|