mirror of
https://github.com/nlohmann/json.git
synced 2026-09-30 19:50:34 +00:00
j.contains(0), j.find(0), and j.count(0) used to compile: the literal 0 is a null pointer constant, so it converts to a null const char*, and the overloads taking const typename object_t::key_type& accepted it by constructing a std::string from that null pointer, which is undefined behavior (a crash with both libc++ and libstdc++). value(0, default_value) had the same problem in C++11, where the object comparator is not transparent. Add deleted overloads for integral arguments to contains(), find() (const and non-const), count(), and value() so that these calls are compile errors in every supported language mode instead of crashing. Calls with string, string_view, json_pointer, and size-typed element access (at(), operator[](), erase()) are unaffected. Fixes #5657. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
3.6 KiB
3.6 KiB
nlohmann::basic_json::contains
// (1)
bool contains(const typename object_t::key_type& key) const;
// (2)
template<typename KeyType>
bool contains(KeyType&& key) const;
// (3)
bool contains(const json_pointer& ptr) const;
- Check whether an element exists in a JSON object with a key equivalent to
key. If the element is not found or the JSON value is not an object,#!cpp falseis returned. - See 1. This overload is only available if
KeyTypeis comparable with#!cpp typename object_t::key_typeand#!cpp typename object_comparator_t::is_transparentdenotes a type. - Check whether the given JSON pointer
ptrcan be resolved in the current JSON value.
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
key(in)- key value to check its existence.
ptr(in)- JSON pointer to check its existence.
Return value
#!cpp trueif an element with specifiedkeyexists. If no such element with such a key is found or the JSON value is not an object,#!cpp falseis returned.- See 1.
#!cpp trueif the JSON pointer can be resolved to a stored value,#!cpp falseotherwise.
Exception safety
Strong exception safety: if an exception occurs, the original value stays intact.
Exceptions
- The function does not throw exceptions.
- The function does not throw exceptions.
- The function does not throw exceptions.
Complexity
Logarithmic in the size of the JSON object.
Notes
- This method always returns
#!cpp falsewhen executed on a JSON type that is not an object. - This method can be executed on any JSON value type.
- Calling this function with an integer argument (for example,
#!cpp contains(0)) does not compile: such an argument would otherwise implicitly convert to a null#!cpp const char*and, from there, cause undefined behavior when constructing a#!cpp std::stringfor the object key. To check for an array element instead, useat,operator[], or compare againstsize.
!!! info "Postconditions"
If `#!cpp j.contains(x)` returns `#!c true` for a key or JSON pointer `x`, then it is safe to call `j[x]`.
Examples
??? example "Example: (1) check with key"
The example shows how `contains()` is used.
```cpp
--8<-- "examples/contains__object_t_key_type.cpp"
```
Output:
```json
--8<-- "examples/contains__object_t_key_type.output"
```
??? example "Example: (2) check with key using string_view"
The example shows how `contains()` is used.
```cpp
--8<-- "examples/contains__keytype.c++17.cpp"
```
Output:
```json
--8<-- "examples/contains__keytype.c++17.output"
```
??? example "Example: (3) check with JSON pointer"
The example shows how `contains()` is used.
```cpp
--8<-- "examples/contains__json_pointer.cpp"
```
Output:
```json
--8<-- "examples/contains__json_pointer.output"
```
See also
Version history
- Added in version 3.11.0.
- Added in version 3.6.0. Extended template
KeyTypeto support comparable types in version 3.11.0. - Added in version 3.7.0.
- Deleted overloads for integral key types added in version 3.13.0 to reject such calls at compile time instead of causing undefined behavior at runtime.