فهرست منبع

Added `JsonVariant` as an input type for `deserializeXxx()`

Benoit Blanchon 5 سال پیش
والد
کامیت
95f05dad66

+ 2 - 0
CHANGELOG.md

@@ -9,6 +9,8 @@ HEAD
 * Visual Studio: fixed error C2766 with flag `/Zc:__cplusplus` (issue #1250)
 * Added support for `JsonDocument` to `copyArray()` (issue #1255)
 * Added support for `enum`s in `as<T>()` and `is<T>()`  (issue #1256)
+* Added `JsonVariant` as an input type for `deserializeXxx()`  
+  For example, you can do: `deserializeJson(doc2, doc1["payload"])`
 
 v6.15.1 (2020-04-08)
 -------

+ 54 - 0
extras/tests/JsonDeserializer/input_types.cpp

@@ -126,3 +126,57 @@ TEST_CASE("deserializeJson(CustomReader)") {
   REQUIRE(doc[0] == 4);
   REQUIRE(doc[1] == 2);
 }
+
+TEST_CASE("deserializeJson(JsonDocument&, MemberProxy)") {
+  DynamicJsonDocument doc1(4096);
+  doc1["payload"] = "[4,2]";
+
+  DynamicJsonDocument doc2(4096);
+  DeserializationError err = deserializeJson(doc2, doc1["payload"]);
+
+  REQUIRE(err == DeserializationError::Ok);
+  REQUIRE(doc2.size() == 2);
+  REQUIRE(doc2[0] == 4);
+  REQUIRE(doc2[1] == 2);
+}
+
+TEST_CASE("deserializeJson(JsonDocument&, JsonVariant)") {
+  DynamicJsonDocument doc1(4096);
+  doc1["payload"] = "[4,2]";
+
+  DynamicJsonDocument doc2(4096);
+  DeserializationError err =
+      deserializeJson(doc2, doc1["payload"].as<JsonVariant>());
+
+  REQUIRE(err == DeserializationError::Ok);
+  REQUIRE(doc2.size() == 2);
+  REQUIRE(doc2[0] == 4);
+  REQUIRE(doc2[1] == 2);
+}
+
+TEST_CASE("deserializeJson(JsonDocument&, JsonVariantConst)") {
+  DynamicJsonDocument doc1(4096);
+  doc1["payload"] = "[4,2]";
+
+  DynamicJsonDocument doc2(4096);
+  DeserializationError err =
+      deserializeJson(doc2, doc1["payload"].as<JsonVariantConst>());
+
+  REQUIRE(err == DeserializationError::Ok);
+  REQUIRE(doc2.size() == 2);
+  REQUIRE(doc2[0] == 4);
+  REQUIRE(doc2[1] == 2);
+}
+
+TEST_CASE("deserializeJson(JsonDocument&, ElementProxy)") {
+  DynamicJsonDocument doc1(4096);
+  doc1[0] = "[4,2]";
+
+  DynamicJsonDocument doc2(4096);
+  DeserializationError err = deserializeJson(doc2, doc1[0]);
+
+  REQUIRE(err == DeserializationError::Ok);
+  REQUIRE(doc2.size() == 2);
+  REQUIRE(doc2[0] == 4);
+  REQUIRE(doc2[1] == 2);
+}

+ 1 - 0
src/ArduinoJson/Deserialization/Reader.hpp

@@ -37,6 +37,7 @@ struct BoundedReader {
 
 #include <ArduinoJson/Deserialization/Readers/IteratorReader.hpp>
 #include <ArduinoJson/Deserialization/Readers/RamReader.hpp>
+#include <ArduinoJson/Deserialization/Readers/VariantReader.hpp>
 
 #if ARDUINOJSON_ENABLE_ARDUINO_STREAM
 #include <ArduinoJson/Deserialization/Readers/ArduinoStreamReader.hpp>

+ 34 - 0
src/ArduinoJson/Deserialization/Readers/VariantReader.hpp

@@ -0,0 +1,34 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2020
+// MIT License
+
+#pragma once
+
+#include <ArduinoJson/Object/MemberProxy.hpp>
+#include <ArduinoJson/Variant/VariantRef.hpp>
+
+namespace ARDUINOJSON_NAMESPACE {
+
+template <typename TArray>
+struct Reader<ElementProxy<TArray>, void> : Reader<char*, void> {
+  explicit Reader(const ElementProxy<TArray>& x)
+      : Reader<char*, void>(x.template as<const char*>()) {}
+};
+
+template <typename TObject, typename TStringRef>
+struct Reader<MemberProxy<TObject, TStringRef>, void> : Reader<char*, void> {
+  explicit Reader(const MemberProxy<TObject, TStringRef>& x)
+      : Reader<char*, void>(x.template as<const char*>()) {}
+};
+
+template <>
+struct Reader<VariantRef, void> : Reader<char*, void> {
+  explicit Reader(VariantRef x) : Reader<char*, void>(x.as<const char*>()) {}
+};
+
+template <>
+struct Reader<VariantConstRef, void> : Reader<char*, void> {
+  explicit Reader(VariantConstRef x)
+      : Reader<char*, void>(x.as<const char*>()) {}
+};
+}  // namespace ARDUINOJSON_NAMESPACE

+ 2 - 0
src/ArduinoJson/Object/MemberProxy.hpp

@@ -7,6 +7,8 @@
 #include <ArduinoJson/Configuration.hpp>
 #include <ArduinoJson/Operators/VariantOperators.hpp>
 #include <ArduinoJson/Polyfills/type_traits.hpp>
+#include <ArduinoJson/Variant/VariantRef.hpp>
+#include <ArduinoJson/Variant/VariantTo.hpp>
 
 #ifdef _MSC_VER
 #pragma warning(push)

+ 8 - 1
src/ArduinoJson/Operators/VariantComparisons.hpp

@@ -4,10 +4,17 @@
 
 #pragma once
 
-#include <ArduinoJson/Variant/VariantRef.hpp>
+#include <ArduinoJson/Configuration.hpp>
+#include <ArduinoJson/Misc/Visitable.hpp>
+#include <ArduinoJson/Numbers/Float.hpp>
+#include <ArduinoJson/Numbers/Integer.hpp>
+#include <ArduinoJson/Polyfills/type_traits.hpp>
+#include <ArduinoJson/Strings/IsString.hpp>
 
 namespace ARDUINOJSON_NAMESPACE {
 
+class CollectionData;
+
 template <typename T, typename Enable = void>
 struct Comparer;
 

+ 1 - 0
src/ArduinoJson/Variant/VariantAs.hpp

@@ -5,6 +5,7 @@
 #pragma once
 
 #include <ArduinoJson/Strings/IsWriteableString.hpp>
+#include <ArduinoJson/Variant/VariantData.hpp>
 
 namespace ARDUINOJSON_NAMESPACE {
 

+ 1 - 0
src/ArduinoJson/Variant/VariantFunctions.hpp

@@ -4,6 +4,7 @@
 
 #pragma once
 
+#include <ArduinoJson/Polyfills/attributes.hpp>
 #include <ArduinoJson/Variant/VariantData.hpp>
 
 namespace ARDUINOJSON_NAMESPACE {