diff --git a/JsonGenerator/JsonObjectBase.cpp b/JsonGenerator/JsonObjectBase.cpp index 32772d19..c05e1825 100644 --- a/JsonGenerator/JsonObjectBase.cpp +++ b/JsonGenerator/JsonObjectBase.cpp @@ -4,15 +4,12 @@ */ #include "JsonObjectBase.h" -#include // for strcmp using namespace ArduinoJson::Generator; using namespace ArduinoJson::Internals; - JsonValue JsonObjectBase::nullValue; - size_t JsonObjectBase::printTo(Print& p) const { size_t n = 0; @@ -47,9 +44,7 @@ JsonValue& JsonObjectBase::operator[](char const* key) for (int i = count; i > 0; --i) { - bool keyMatches = strcmp(p->key, key) == 0; - - if (keyMatches) + if (p->matches(key)) return p->value; p++; @@ -70,4 +65,19 @@ JsonValue& JsonObjectBase::operator[](char const* key) value->reset(); return *value; +} + +bool JsonObjectBase::containsKey(char const* key) const +{ + KeyValuePair* p = items; + + for (int i = count; i > 0; --i) + { + if (p->matches(key)) + return true; + + p++; + } + + return false; } \ No newline at end of file diff --git a/JsonGenerator/JsonObjectBase.h b/JsonGenerator/JsonObjectBase.h index 4bcb4ad3..3514fa53 100644 --- a/JsonGenerator/JsonObjectBase.h +++ b/JsonGenerator/JsonObjectBase.h @@ -7,6 +7,7 @@ #include "JsonPrintable.h" #include "EscapedString.h" +#include // for strcmp namespace ArduinoJson { @@ -18,6 +19,8 @@ namespace ArduinoJson JsonValue& operator[](const char*); + bool containsKey(const char*) const; + template void add(const char* key, T value) { @@ -40,6 +43,11 @@ namespace ArduinoJson { const char* key; JsonValue value; + + bool matches(const char* candidateKey) const + { + return strcmp(key, candidateKey) == 0; + } }; JsonObjectBase(KeyValuePair* items, int capacity) diff --git a/JsonGeneratorTests/JsonObject_Indexer_Tests.cpp b/JsonGeneratorTests/JsonObject_Indexer_Tests.cpp index 33e714ef..69a67de0 100644 --- a/JsonGeneratorTests/JsonObject_Indexer_Tests.cpp +++ b/JsonGeneratorTests/JsonObject_Indexer_Tests.cpp @@ -35,12 +35,16 @@ namespace JsonGeneratorTests void mustContain(const char* key, const char* expected) { + Assert::IsTrue(object.containsKey(key)); + const char* actual = object[key]; Assert::AreEqual(expected, actual); } void mustNotContain(const char* key) { + Assert::IsFalse(object.containsKey(key)); + const char* actual = object[key]; Assert::IsNull(actual); }