Просмотр исходного кода

Support `ElementProxy` and `MemberProxy` in `JsonDocument`'s constructor

Benoit Blanchon 1 год назад
Родитель
Сommit
aeb30ef307

+ 4 - 0
CHANGELOG.md

@@ -1,12 +1,16 @@
 ArduinoJson: change log
 =======================
 
+HEAD
+----
+
 * Add `ARDUINOJSON_STRING_LENGTH_SIZE` to the namespace name
 * Add MsgPack bin8/bin16/bin32 support (PR #2078 by @Sanae6)
 * Make string support even more generic (PR #2084 by @d-a-v)
 * Optimize `deserializeMsgPack()`
 * Allow using a `JsonVariant` as a key or index (issue #2080)
   Note: works only for reading, not for writing
+* Support `ElementProxy` and `MemberProxy` in `JsonDocument`'s constructor
 
 v7.0.4 (2024-03-12)
 ------

+ 18 - 0
extras/tests/JsonDocument/constructor.cpp

@@ -126,4 +126,22 @@ TEST_CASE("JsonDocument constructor") {
 
     REQUIRE(doc2.as<std::string>() == "hello");
   }
+
+  SECTION("JsonDocument(ElementProxy)") {
+    JsonDocument doc1;
+    deserializeJson(doc1, "[\"hello\",\"world\"]");
+
+    JsonDocument doc2(doc1[1]);
+
+    REQUIRE(doc2.as<std::string>() == "world");
+  }
+
+  SECTION("JsonDocument(MemberProxy)") {
+    JsonDocument doc1;
+    deserializeJson(doc1, "{\"hello\":\"world\"}");
+
+    JsonDocument doc2(doc1["hello"]);
+
+    REQUIRE(doc2.as<std::string>() == "world");
+  }
 }

+ 7 - 9
src/ArduinoJson/Document/JsonDocument.hpp

@@ -37,15 +37,13 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
 
   // Construct from variant, array, or object
   template <typename T>
-  JsonDocument(const T& src,
-               Allocator* alloc = detail::DefaultAllocator::instance(),
-               typename detail::enable_if<
-                   detail::is_same<T, JsonVariant>::value ||
-                   detail::is_same<T, JsonVariantConst>::value ||
-                   detail::is_same<T, JsonArray>::value ||
-                   detail::is_same<T, JsonArrayConst>::value ||
-                   detail::is_same<T, JsonObject>::value ||
-                   detail::is_same<T, JsonObjectConst>::value>::type* = 0)
+  JsonDocument(
+      const T& src, Allocator* alloc = detail::DefaultAllocator::instance(),
+      typename detail::enable_if<
+          detail::IsVariant<T>::value || detail::is_same<T, JsonArray>::value ||
+          detail::is_same<T, JsonArrayConst>::value ||
+          detail::is_same<T, JsonObject>::value ||
+          detail::is_same<T, JsonObjectConst>::value>::type* = 0)
       : JsonDocument(alloc) {
     set(src);
   }