diff --git a/include/ArduinoJson/JsonVariant.hpp b/include/ArduinoJson/JsonVariant.hpp index 39a90a53..1863c4e7 100644 --- a/include/ArduinoJson/JsonVariant.hpp +++ b/include/ArduinoJson/JsonVariant.hpp @@ -91,13 +91,17 @@ class JsonVariant { static JsonVariant &invalid() { return _invalid; } - bool success() { return _type != Internals::JSON_INVALID; } + bool success() { + return _type != Internals::JSON_INVALID && + _type != Internals::JSON_UNDEFINED; + } template void writeTo(T &writer) const; size_t size() const; JsonVariant &operator[](int index); + JsonVariant &operator[](const char *key); private: JsonVariant(Internals::JsonVariantType type) : _type(type) {} diff --git a/src/JsonVariant.cpp b/src/JsonVariant.cpp index 5658390c..05f595fc 100644 --- a/src/JsonVariant.cpp +++ b/src/JsonVariant.cpp @@ -86,6 +86,11 @@ JsonVariant &JsonVariant::operator[](int index) { return _content.asArray->operator[](index); } +JsonVariant &JsonVariant::operator[](const char *key) { + if (_type != JSON_OBJECT) return JsonVariant::invalid(); + return _content.asObject->operator[](key); +} + template void JsonVariant::writeTo(T &writer) const { switch (_type) { diff --git a/test/JsonVariant_Subscript_Tests.cpp b/test/JsonVariant_Subscript_Tests.cpp index 17798555..c11bf91a 100644 --- a/test/JsonVariant_Subscript_Tests.cpp +++ b/test/JsonVariant_Subscript_Tests.cpp @@ -29,4 +29,19 @@ TEST_F(JsonVariant_Subscript_Tests, Array) { EXPECT_STREQ("element at index 1", variant[1].asString()); EXPECT_FALSE(variant[-1].success()); EXPECT_FALSE(variant[3].success()); + EXPECT_FALSE(variant["0"].success()); +} + +TEST_F(JsonVariant_Subscript_Tests, Object) { + JsonObject &object = buffer.createObject(); + object["a"] = "element at key \"a\""; + object["b"] = "element at key \"b\""; + + variant = object; + + EXPECT_EQ(2, variant.size()); + EXPECT_STREQ("element at key \"a\"", variant["a"].asString()); + EXPECT_STREQ("element at key \"b\"", variant["b"].asString()); + EXPECT_FALSE(variant["c"].success()); + EXPECT_FALSE(variant[0].success()); }