diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f2ec63e..3607f9ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ HEAD Dependent settings (like `ARDUINOJSON_DEFAULT_NESTING_LIMIT`) must be set individually. * Change the default of `ARDUINOJSON_USE_DOUBLE` to `1` * Change the default of `ARDUINOJSON_USE_LONG_LONG` to `1` on 32-bit platforms +* Add `as()` v6.18.5 (2021-09-28) ------- diff --git a/extras/tests/JsonVariant/as.cpp b/extras/tests/JsonVariant/as.cpp index add6b10c..2291c6b5 100644 --- a/extras/tests/JsonVariant/as.cpp +++ b/extras/tests/JsonVariant/as.cpp @@ -24,6 +24,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(0.0f == variant.as()); REQUIRE(0 == variant.as()); REQUIRE("null" == variant.as()); + REQUIRE(variant.as().isNull()); } SECTION("set(4.2)") { @@ -34,6 +35,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == "4.2"); REQUIRE(variant.as() == 4L); REQUIRE(variant.as() == 4U); + REQUIRE(variant.as().isNull()); } SECTION("set(0.0)") { @@ -41,6 +43,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == false); REQUIRE(variant.as() == 0L); + REQUIRE(variant.as().isNull()); } SECTION("set(false)") { @@ -50,6 +53,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == 0.0); REQUIRE(variant.as() == 0L); REQUIRE(variant.as() == "false"); + REQUIRE(variant.as().isNull()); } SECTION("set(true)") { @@ -59,6 +63,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == 1.0); REQUIRE(variant.as() == 1L); REQUIRE(variant.as() == "true"); + REQUIRE(variant.as().isNull()); } SECTION("set(42)") { @@ -69,6 +74,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == 42); REQUIRE(variant.as() == 42U); // issue #1601 REQUIRE(variant.as() == "42"); + REQUIRE(variant.as().isNull()); } SECTION("set(42L)") { @@ -77,6 +83,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == true); REQUIRE(variant.as() == 42.0); REQUIRE(variant.as() == "42"); + REQUIRE(variant.as().isNull()); } SECTION("set(-42L)") { @@ -84,6 +91,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == -42.0); REQUIRE(variant.as() == "-42"); + REQUIRE(variant.as().isNull()); } SECTION("set(42UL)") { @@ -92,6 +100,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == true); REQUIRE(variant.as() == 42.0); REQUIRE(variant.as() == "42"); + REQUIRE(variant.as().isNull()); } SECTION("set(0L)") { @@ -100,6 +109,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == false); REQUIRE(variant.as() == 0.0); REQUIRE(variant.as() == "0"); + REQUIRE(variant.as().isNull()); } SECTION("set(0UL)") { @@ -108,6 +118,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == false); REQUIRE(variant.as() == 0.0); REQUIRE(variant.as() == "0"); + REQUIRE(variant.as().isNull()); } SECTION("set(null)") { @@ -117,12 +128,14 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == 0.0); REQUIRE(variant.as() == 0L); REQUIRE(variant.as() == "null"); + REQUIRE(variant.as().isNull()); } SECTION("set(\"42\")") { variant.set("42"); REQUIRE(variant.as() == 42L); + REQUIRE(variant.as() == "42"); } SECTION("set(\"hello\")") { @@ -133,6 +146,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == std::string("hello")); REQUIRE(variant.as() == std::string("hello")); REQUIRE(variant.as() == std::string("hello")); + REQUIRE(variant.as() == "hello"); } SECTION("set(std::string(\"4.2\"))") { @@ -143,6 +157,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == 4.2); REQUIRE(variant.as() == std::string("4.2")); REQUIRE(variant.as() == std::string("4.2")); + REQUIRE(variant.as() == "4.2"); } SECTION("set(\"true\")") { @@ -150,6 +165,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == true); REQUIRE(variant.as() == 0); + REQUIRE(variant.as() == "true"); } SECTION("set(-1e300)") { @@ -159,6 +175,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == -1e300); REQUIRE(variant.as() < 0); REQUIRE(my::isinf(variant.as())); + REQUIRE(variant.as().isNull()); } SECTION("set(1e300)") { @@ -168,6 +185,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == 1e300); REQUIRE(variant.as() > 0); REQUIRE(my::isinf(variant.as())); + REQUIRE(variant.as().isNull()); } SECTION("set(1e-300)") { @@ -176,6 +194,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == true); REQUIRE(variant.as() == 1e-300); REQUIRE(variant.as() == 0); + REQUIRE(variant.as().isNull()); } SECTION("to()") { diff --git a/src/ArduinoJson/Variant/ConverterImpl.hpp b/src/ArduinoJson/Variant/ConverterImpl.hpp index e3288c8b..8f4d456c 100644 --- a/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -129,6 +129,18 @@ struct Converter { } }; +template <> +struct Converter { + static void toJson(String src, VariantRef dst) { + variantSetString(getData(dst), adaptString(src), getPool(dst)); + } + + static String fromJson(VariantConstRef src) { + const VariantData* data = getData(src); + return data ? String(data->asString(), false) : 0; + } +}; + template inline typename enable_if::value, bool>::type convertToJson( const T& src, VariantRef dst) {