Skip to content

Commit

Permalink
Merge pull request #1474 from nickaein/develop
Browse files Browse the repository at this point in the history
Implement contains() member function
  • Loading branch information
nlohmann authored Feb 13, 2019
2 parents c55cace + e93f305 commit e326df2
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 0 deletions.
33 changes: 33 additions & 0 deletions include/nlohmann/json.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3957,6 +3957,39 @@ class basic_json
return is_object() ? m_value.object->count(std::forward<KeyT>(key)) : 0;
}

/*!
@brief check the existence of an element in a JSON object
Check whether an element exists in a JSON object with key equivalent to
@a key. If the element is not found or the JSON value is not an object,
false is returned.
@note This method always returns false when executed on a JSON type
that is not an object.
@param[in] key key value to check its existence.
@return true if an element with specified @a key exists. If no such
element with such key is found or the JSON value is not an object,
false is returned.
@complexity Logarithmic in the size of the JSON object.
@since version 3.6.0
*/
template<typename KeyT>
bool contains(KeyT&& key) const
{
if (is_object())
{
return (m_value.object->find(std::forward<KeyT>(key)) != m_value.object->end());
}
else
{
return false;
}
}

/// @}


Expand Down
33 changes: 33 additions & 0 deletions single_include/nlohmann/json.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16465,6 +16465,39 @@ class basic_json
return is_object() ? m_value.object->count(std::forward<KeyT>(key)) : 0;
}

/*!
@brief check the existence of an element in a JSON object

Check whether an element exists in a JSON object with key equivalent to
@a key. If the element is not found or the JSON value is not an object,
false is returned.

@note This method always returns false when executed on a JSON type
that is not an object.

@param[in] key key value to check its existence.

@return true if an element with specified @a key exists. If no such
element with such key is found or the JSON value is not an object,
false is returned.

@complexity Logarithmic in the size of the JSON object.

@since version 3.6.0
*/
template<typename KeyT>
bool contains(KeyT&& key) const
{
if (is_object())
{
return (m_value.object->find(std::forward<KeyT>(key)) != m_value.object->end());
}
else
{
return false;
}
}

/// @}


Expand Down
87 changes: 87 additions & 0 deletions test/src/unit-element_access2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -982,6 +982,93 @@ TEST_CASE("element access 2")
}
}
}

SECTION("check existence of key in an object")
{
SECTION("existing element")
{
for (auto key :
{"integer", "unsigned", "floating", "null", "string", "boolean", "object", "array"
})
{
CHECK(j.contains(key) == true);
CHECK(j_const.contains(key) == true);
}
}

SECTION("nonexisting element")
{
CHECK(j.contains("foo") == false);
CHECK(j_const.contains("foo") == false);
}

SECTION("all types")
{
SECTION("null")
{
json j_nonobject(json::value_t::null);
const json j_nonobject_const(j_nonobject);
CHECK(j_nonobject.contains("foo") == false);
CHECK(j_nonobject_const.contains("foo") == false);
}

SECTION("string")
{
json j_nonobject(json::value_t::string);
const json j_nonobject_const(j_nonobject);
CHECK(j_nonobject.contains("foo") == false);
CHECK(j_nonobject_const.contains("foo") == false);
}

SECTION("object")
{
json j_nonobject(json::value_t::object);
const json j_nonobject_const(j_nonobject);
CHECK(j_nonobject.contains("foo") == false);
CHECK(j_nonobject_const.contains("foo") == false);
}

SECTION("array")
{
json j_nonobject(json::value_t::array);
const json j_nonobject_const(j_nonobject);
CHECK(j_nonobject.contains("foo") == false);
CHECK(j_nonobject_const.contains("foo") == false);
}

SECTION("boolean")
{
json j_nonobject(json::value_t::boolean);
const json j_nonobject_const(j_nonobject);
CHECK(j_nonobject.contains("foo") == false);
CHECK(j_nonobject_const.contains("foo") == false);
}

SECTION("number (integer)")
{
json j_nonobject(json::value_t::number_integer);
const json j_nonobject_const(j_nonobject);
CHECK(j_nonobject.contains("foo") == false);
CHECK(j_nonobject_const.contains("foo") == false);
}

SECTION("number (unsigned)")
{
json j_nonobject(json::value_t::number_unsigned);
const json j_nonobject_const(j_nonobject);
CHECK(j_nonobject.contains("foo") == false);
CHECK(j_nonobject_const.contains("foo") == false);
}

SECTION("number (floating-point)")
{
json j_nonobject(json::value_t::number_float);
const json j_nonobject_const(j_nonobject);
CHECK(j_nonobject.contains("foo") == false);
CHECK(j_nonobject_const.contains("foo") == false);
}
}
}
}
}

Expand Down

0 comments on commit e326df2

Please sign in to comment.