diff --git a/extras/tests/JsonVariant/as.cpp b/extras/tests/JsonVariant/as.cpp index 2291c6b5..17f451ed 100644 --- a/extras/tests/JsonVariant/as.cpp +++ b/extras/tests/JsonVariant/as.cpp @@ -136,6 +136,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == 42L); REQUIRE(variant.as() == "42"); + REQUIRE(variant.as().isStatic() == true); } SECTION("set(\"hello\")") { @@ -158,6 +159,7 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(variant.as() == std::string("4.2")); REQUIRE(variant.as() == std::string("4.2")); REQUIRE(variant.as() == "4.2"); + REQUIRE(variant.as().isStatic() == false); } SECTION("set(\"true\")") { diff --git a/src/ArduinoJson/Variant/ConverterImpl.hpp b/src/ArduinoJson/Variant/ConverterImpl.hpp index 38e8f4b0..236ed612 100644 --- a/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -120,7 +120,7 @@ struct Converter { static const char* fromJson(VariantConstRef src) { const VariantData* data = getData(src); - return data ? data->asString() : 0; + return data ? data->asString().c_str() : 0; } static bool checkJson(VariantConstRef src) { @@ -137,7 +137,7 @@ struct Converter { static String fromJson(VariantConstRef src) { const VariantData* data = getData(src); - return data ? String(data->asString(), false) : 0; + return data ? data->asString() : 0; } static bool checkJson(VariantConstRef src) { @@ -158,9 +158,9 @@ template inline typename enable_if::value>::type convertFromJson( VariantConstRef src, T& dst) { const VariantData* data = getData(src); - const char* cstr = data != 0 ? data->asString() : 0; - if (cstr) - dst = cstr; + String str = data != 0 ? data->asString() : 0; + if (str) + dst = str.c_str(); else serializeJson(src, dst); } diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 388b7e25..5627c51d 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -76,7 +77,7 @@ class VariantData { template T asFloat() const; - const char *asString() const; + String asString() const; bool asBoolean() const; diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index ea49a92f..e87557aa 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -70,11 +70,12 @@ inline T VariantData::asFloat() const { } } -inline const char *VariantData::asString() const { +inline String VariantData::asString() const { switch (type()) { case VALUE_IS_LINKED_STRING: + return String(_content.asString, true); case VALUE_IS_OWNED_STRING: - return _content.asString; + return String(_content.asString, false); default: return 0; }