diff --git a/CHANGELOG.md b/CHANGELOG.md index 1aa1d9ae..a1637e96 100644 --- a/CHANGELOG.md +++ b/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()` and `is()` (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) ------- diff --git a/extras/tests/JsonDeserializer/input_types.cpp b/extras/tests/JsonDeserializer/input_types.cpp index 17294f24..d367e1ad 100644 --- a/extras/tests/JsonDeserializer/input_types.cpp +++ b/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()); + + 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()); + + 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); +} diff --git a/src/ArduinoJson/Deserialization/Reader.hpp b/src/ArduinoJson/Deserialization/Reader.hpp index 9473f69e..da9a9f24 100644 --- a/src/ArduinoJson/Deserialization/Reader.hpp +++ b/src/ArduinoJson/Deserialization/Reader.hpp @@ -37,6 +37,7 @@ struct BoundedReader { #include #include +#include #if ARDUINOJSON_ENABLE_ARDUINO_STREAM #include diff --git a/src/ArduinoJson/Deserialization/Readers/VariantReader.hpp b/src/ArduinoJson/Deserialization/Readers/VariantReader.hpp new file mode 100644 index 00000000..b06bd4a0 --- /dev/null +++ b/src/ArduinoJson/Deserialization/Readers/VariantReader.hpp @@ -0,0 +1,34 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2020 +// MIT License + +#pragma once + +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +template +struct Reader, void> : Reader { + explicit Reader(const ElementProxy& x) + : Reader(x.template as()) {} +}; + +template +struct Reader, void> : Reader { + explicit Reader(const MemberProxy& x) + : Reader(x.template as()) {} +}; + +template <> +struct Reader : Reader { + explicit Reader(VariantRef x) : Reader(x.as()) {} +}; + +template <> +struct Reader : Reader { + explicit Reader(VariantConstRef x) + : Reader(x.as()) {} +}; +} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Object/MemberProxy.hpp b/src/ArduinoJson/Object/MemberProxy.hpp index d33b509d..82814250 100644 --- a/src/ArduinoJson/Object/MemberProxy.hpp +++ b/src/ArduinoJson/Object/MemberProxy.hpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include #ifdef _MSC_VER #pragma warning(push) diff --git a/src/ArduinoJson/Operators/VariantComparisons.hpp b/src/ArduinoJson/Operators/VariantComparisons.hpp index f1ff32e1..b0f93612 100644 --- a/src/ArduinoJson/Operators/VariantComparisons.hpp +++ b/src/ArduinoJson/Operators/VariantComparisons.hpp @@ -4,10 +4,17 @@ #pragma once -#include +#include +#include +#include +#include +#include +#include namespace ARDUINOJSON_NAMESPACE { +class CollectionData; + template struct Comparer; diff --git a/src/ArduinoJson/Variant/VariantAs.hpp b/src/ArduinoJson/Variant/VariantAs.hpp index dd428871..de6f7faa 100644 --- a/src/ArduinoJson/Variant/VariantAs.hpp +++ b/src/ArduinoJson/Variant/VariantAs.hpp @@ -5,6 +5,7 @@ #pragma once #include +#include namespace ARDUINOJSON_NAMESPACE { diff --git a/src/ArduinoJson/Variant/VariantFunctions.hpp b/src/ArduinoJson/Variant/VariantFunctions.hpp index 26f9077d..7b2a9b66 100644 --- a/src/ArduinoJson/Variant/VariantFunctions.hpp +++ b/src/ArduinoJson/Variant/VariantFunctions.hpp @@ -4,6 +4,7 @@ #pragma once +#include #include namespace ARDUINOJSON_NAMESPACE {