diff --git a/CHANGELOG.md b/CHANGELOG.md index a91cbf3d..30139e10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ArduinoJson: change log HEAD ---- +* Added ability to set a nested value like this: `root["A"]["B"] = "C"` (issue #352) * Renamed `*.ipp` to `*Impl.hpp` because they were ignored by Arduino IDE (issue #396) v5.7.2 diff --git a/include/ArduinoJson/JsonArraySubscript.hpp b/include/ArduinoJson/JsonArraySubscript.hpp index eea1b80b..b7475104 100644 --- a/include/ArduinoJson/JsonArraySubscript.hpp +++ b/include/ArduinoJson/JsonArraySubscript.hpp @@ -67,6 +67,11 @@ inline JsonArraySubscript JsonArray::operator[](size_t index) { return JsonArraySubscript(*this, index); } +template +inline JsonArraySubscript JsonVariantBase::operator[](int index) { + return asArray()[index]; +} + template inline const JsonArraySubscript JsonVariantBase::operator[]( int index) const { diff --git a/include/ArduinoJson/JsonVariantBase.hpp b/include/ArduinoJson/JsonVariantBase.hpp index 13875a94..a6f5d6db 100644 --- a/include/ArduinoJson/JsonVariantBase.hpp +++ b/include/ArduinoJson/JsonVariantBase.hpp @@ -71,6 +71,7 @@ class JsonVariantBase : public Internals::JsonPrintable { // Returns the element at specified index if the variant is an array. // Returns JsonVariant::invalid() if the variant is not an array. FORCE_INLINE const JsonArraySubscript operator[](int index) const; + FORCE_INLINE JsonArraySubscript operator[](int index); // Mimics an object. // Returns the value associated with the specified key if the variant is @@ -83,6 +84,13 @@ class JsonVariantBase : public Internals::JsonPrintable { operator[](const TString &key) const { return asObject()[key]; } + template + FORCE_INLINE + typename TypeTraits::EnableIf::has_equals, + JsonObjectSubscript >::type + operator[](const TString &key) { + return asObject()[key]; + } private: const TImpl *impl() const { diff --git a/test/JsonVariant_Subscript_Tests.cpp b/test/JsonVariant_Subscript_Tests.cpp index c6b5c4fa..7bbcd8dd 100644 --- a/test/JsonVariant_Subscript_Tests.cpp +++ b/test/JsonVariant_Subscript_Tests.cpp @@ -59,3 +59,25 @@ TEST_F(JsonVariant_Subscript_Tests, String) { EXPECT_FALSE(_variant["0"].success()); EXPECT_FALSE(_variant[0].success()); } + +TEST_F(JsonVariant_Subscript_Tests, ObjectSetValue) { + _variant = _jsonBuffer.createObject(); + _variant["hello"] = "world"; + EXPECT_EQ(1, _variant.size()); + EXPECT_STREQ("world", _variant["hello"]); +} + +TEST_F(JsonVariant_Subscript_Tests, ArraySetValue) { + _variant = _jsonBuffer.parseArray("[\"hello\"]"); + _variant[0] = "world"; + EXPECT_EQ(1, _variant.size()); + EXPECT_STREQ("world", _variant[0]); +} + +TEST_F(JsonVariant_Subscript_Tests, NestedObjectSetValue) { + _variant = _jsonBuffer.parseArray("[{}]"); + _variant[0]["hello"] = "world"; + EXPECT_EQ(1, _variant.size()); + EXPECT_EQ(1, _variant[0].size()); + EXPECT_STREQ("world", _variant[0]["hello"]); +}