diff --git a/extras/tests/Deprecated/CMakeLists.txt b/extras/tests/Deprecated/CMakeLists.txt index 3c2c57b8..dd86f047 100644 --- a/extras/tests/Deprecated/CMakeLists.txt +++ b/extras/tests/Deprecated/CMakeLists.txt @@ -17,6 +17,7 @@ endif() add_executable(DeprecatedTests add.cpp createNestedArray.cpp + createNestedObject.cpp BasicJsonDocument.cpp DynamicJsonDocument.cpp memoryUsage.cpp diff --git a/extras/tests/Deprecated/createNestedObject.cpp b/extras/tests/Deprecated/createNestedObject.cpp new file mode 100644 index 00000000..24ade4ee --- /dev/null +++ b/extras/tests/Deprecated/createNestedObject.cpp @@ -0,0 +1,111 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2023, Benoit BLANCHON +// MIT License + +#include +#include + +#include + +TEST_CASE("JsonDocument::createNestedObject()") { + JsonDocument doc; + + SECTION("createNestedObject()") { + JsonObject object = doc.createNestedObject(); + object["hello"] = "world"; + REQUIRE(doc.as() == "[{\"hello\":\"world\"}]"); + } + + SECTION("createNestedObject(const char*)") { + JsonObject object = doc.createNestedObject("key"); + object["hello"] = "world"; + REQUIRE(doc.as() == "{\"key\":{\"hello\":\"world\"}}"); + } + + SECTION("createNestedObject(std::string)") { + JsonObject object = doc.createNestedObject(std::string("key")); + object["hello"] = "world"; + REQUIRE(doc.as() == "{\"key\":{\"hello\":\"world\"}}"); + } + +#ifdef HAS_VARIABLE_LENGTH_ARRAY + SECTION("createNestedObject(VLA)") { + size_t i = 16; + char vla[i]; + strcpy(vla, "key"); + JsonObject object = doc.createNestedObject(vla); + object["hello"] = "world"; + REQUIRE(doc.as() == "{\"key\":{\"hello\":\"world\"}}"); + } +#endif +} + +TEST_CASE("JsonArray::createNestedObject()") { + JsonDocument doc; + JsonArray array = doc.to(); + JsonObject object = array.createNestedObject(); + object["hello"] = "world"; + REQUIRE(doc.as() == "[{\"hello\":\"world\"}]"); +} + +TEST_CASE("JsonObject::createNestedObject()") { + JsonDocument doc; + JsonObject object = doc.to(); + + SECTION("createNestedObject(const char*)") { + JsonObject nestedObject = object.createNestedObject("key"); + nestedObject["hello"] = "world"; + REQUIRE(doc.as() == "{\"key\":{\"hello\":\"world\"}}"); + } + + SECTION("createNestedObject(std::string)") { + JsonObject nestedObject = object.createNestedObject(std::string("key")); + nestedObject["hello"] = "world"; + REQUIRE(doc.as() == "{\"key\":{\"hello\":\"world\"}}"); + } + +#ifdef HAS_VARIABLE_LENGTH_ARRAY + SECTION("createNestedObject(VLA)") { + size_t i = 16; + char vla[i]; + strcpy(vla, "key"); + JsonObject nestedObject = object.createNestedObject(vla); + nestedObject["hello"] = "world"; + REQUIRE(doc.as() == "{\"key\":{\"hello\":\"world\"}}"); + } +#endif +} + +TEST_CASE("JsonVariant::createNestedObject()") { + JsonDocument doc; + JsonVariant variant = doc.to(); + + SECTION("createNestedObject()") { + JsonObject object = variant.createNestedObject(); + object["hello"] = "world"; + REQUIRE(doc.as() == "[{\"hello\":\"world\"}]"); + } + + SECTION("createNestedObject(const char*)") { + JsonObject object = variant.createNestedObject("key"); + object["hello"] = "world"; + REQUIRE(doc.as() == "{\"key\":{\"hello\":\"world\"}}"); + } + + SECTION("createNestedObject(std::string)") { + JsonObject object = variant.createNestedObject(std::string("key")); + object["hello"] = "world"; + REQUIRE(doc.as() == "{\"key\":{\"hello\":\"world\"}}"); + } + +#ifdef HAS_VARIABLE_LENGTH_ARRAY + SECTION("createNestedObject(VLA)") { + size_t i = 16; + char vla[i]; + strcpy(vla, "key"); + JsonObject object = variant.createNestedObject(vla); + object["hello"] = "world"; + REQUIRE(doc.as() == "{\"key\":{\"hello\":\"world\"}}"); + } +#endif +} diff --git a/src/ArduinoJson/Array/JsonArray.hpp b/src/ArduinoJson/Array/JsonArray.hpp index 22c81d40..b339d979 100644 --- a/src/ArduinoJson/Array/JsonArray.hpp +++ b/src/ArduinoJson/Array/JsonArray.hpp @@ -170,6 +170,10 @@ class JsonArray : public detail::VariantOperators { return add(); } + // DEPRECATED: use add() instead + ARDUINOJSON_DEPRECATED("use add() instead") + JsonObject createNestedObject() const; + // DEPRECATED: always returns zero ARDUINOJSON_DEPRECATED("always returns zero") size_t memoryUsage() const { diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 52fb248a..215f5ff1 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -317,6 +317,26 @@ class JsonDocument : public detail::VariantOperators { return operator[](key).template to(); } + // DEPRECATED: use add() instead + ARDUINOJSON_DEPRECATED("use add() instead") + JsonObject createNestedObject() { + return add(); + } + + // DEPRECATED: use doc[key].to() instead + template + ARDUINOJSON_DEPRECATED("use doc[key].to() instead") + JsonObject createNestedObject(TChar* key) { + return operator[](key).template to(); + } + + // DEPRECATED: use doc[key].to() instead + template + ARDUINOJSON_DEPRECATED("use doc[key].to() instead") + JsonObject createNestedObject(const TString& key) { + return operator[](key).template to(); + } + // DEPRECATED: always returns zero ARDUINOJSON_DEPRECATED("always returns zero") size_t memoryUsage() const { diff --git a/src/ArduinoJson/Object/JsonObject.hpp b/src/ArduinoJson/Object/JsonObject.hpp index 6959805b..60e1e4e9 100644 --- a/src/ArduinoJson/Object/JsonObject.hpp +++ b/src/ArduinoJson/Object/JsonObject.hpp @@ -180,6 +180,20 @@ class JsonObject : public detail::VariantOperators { return operator[](key).template to(); } + // DEPRECATED: use obj[key].to() instead + template + ARDUINOJSON_DEPRECATED("use obj[key].to() instead") + JsonObject createNestedObject(TChar* key) { + return operator[](key).template to(); + } + + // DEPRECATED: use obj[key].to() instead + template + ARDUINOJSON_DEPRECATED("use obj[key].to() instead") + JsonObject createNestedObject(const TString& key) { + return operator[](key).template to(); + } + // DEPRECATED: always returns zero ARDUINOJSON_DEPRECATED("always returns zero") size_t memoryUsage() const { diff --git a/src/ArduinoJson/Variant/VariantRefBase.hpp b/src/ArduinoJson/Variant/VariantRefBase.hpp index b820e870..6353d9dc 100644 --- a/src/ArduinoJson/Variant/VariantRefBase.hpp +++ b/src/ArduinoJson/Variant/VariantRefBase.hpp @@ -239,6 +239,20 @@ class VariantRefBase : public VariantTag { ARDUINOJSON_DEPRECATED("use var[key].to() instead") JsonArray createNestedArray(const TString& key) const; + // DEPRECATED: use add() instead + ARDUINOJSON_DEPRECATED("use add() instead") + JsonObject createNestedObject() const; + + // DEPRECATED: use var[key].to() instead + template + ARDUINOJSON_DEPRECATED("use var[key].to() instead") + JsonObject createNestedObject(TChar* key) const; + + // DEPRECATED: use var[key].to() instead + template + ARDUINOJSON_DEPRECATED("use var[key].to() instead") + JsonObject createNestedObject(const TString& key) const; + // DEPRECATED: always returns zero ARDUINOJSON_DEPRECATED("always returns zero") size_t memoryUsage() const { diff --git a/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp b/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp index a2eb3622..7f925746 100644 --- a/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp +++ b/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp @@ -33,6 +33,25 @@ inline JsonArray VariantRefBase::createNestedArray( return operator[](key).template to(); } +template +inline JsonObject VariantRefBase::createNestedObject() const { + return add(); +} + +template +template +inline JsonObject VariantRefBase::createNestedObject( + TChar* key) const { + return operator[](key).template to(); +} + +template +template +inline JsonObject VariantRefBase::createNestedObject( + const TString& key) const { + return operator[](key).template to(); +} + template inline void convertToJson(const VariantRefBase& src, JsonVariant dst) { diff --git a/src/ArduinoJson/compatibility.hpp b/src/ArduinoJson/compatibility.hpp index 9e9610b3..5016f40f 100644 --- a/src/ArduinoJson/compatibility.hpp +++ b/src/ArduinoJson/compatibility.hpp @@ -109,4 +109,8 @@ class ARDUINOJSON_DEPRECATED("use JsonDocument instead") DynamicJsonDocument size_t _capacity; }; +inline JsonObject JsonArray::createNestedObject() const { + return add(); +} + ARDUINOJSON_END_PUBLIC_NAMESPACE