Add as<JsonString>()

This commit is contained in:
Benoit Blanchon
2021-10-24 09:58:13 +02:00
parent 7f5497db55
commit df4a4b9e1d
3 changed files with 32 additions and 0 deletions

View File

@ -8,6 +8,7 @@ HEAD
Dependent settings (like `ARDUINOJSON_DEFAULT_NESTING_LIMIT`) must be set individually. 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_DOUBLE` to `1`
* Change the default of `ARDUINOJSON_USE_LONG_LONG` to `1` on 32-bit platforms * Change the default of `ARDUINOJSON_USE_LONG_LONG` to `1` on 32-bit platforms
* Add `as<JsonString>()`
v6.18.5 (2021-09-28) v6.18.5 (2021-09-28)
------- -------

View File

@ -24,6 +24,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(0.0f == variant.as<float>()); REQUIRE(0.0f == variant.as<float>());
REQUIRE(0 == variant.as<const char*>()); REQUIRE(0 == variant.as<const char*>());
REQUIRE("null" == variant.as<std::string>()); REQUIRE("null" == variant.as<std::string>());
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(4.2)") { SECTION("set(4.2)") {
@ -34,6 +35,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<std::string>() == "4.2"); REQUIRE(variant.as<std::string>() == "4.2");
REQUIRE(variant.as<long>() == 4L); REQUIRE(variant.as<long>() == 4L);
REQUIRE(variant.as<unsigned>() == 4U); REQUIRE(variant.as<unsigned>() == 4U);
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(0.0)") { SECTION("set(0.0)") {
@ -41,6 +43,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<bool>() == false); REQUIRE(variant.as<bool>() == false);
REQUIRE(variant.as<long>() == 0L); REQUIRE(variant.as<long>() == 0L);
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(false)") { SECTION("set(false)") {
@ -50,6 +53,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<double>() == 0.0); REQUIRE(variant.as<double>() == 0.0);
REQUIRE(variant.as<long>() == 0L); REQUIRE(variant.as<long>() == 0L);
REQUIRE(variant.as<std::string>() == "false"); REQUIRE(variant.as<std::string>() == "false");
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(true)") { SECTION("set(true)") {
@ -59,6 +63,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<double>() == 1.0); REQUIRE(variant.as<double>() == 1.0);
REQUIRE(variant.as<long>() == 1L); REQUIRE(variant.as<long>() == 1L);
REQUIRE(variant.as<std::string>() == "true"); REQUIRE(variant.as<std::string>() == "true");
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(42)") { SECTION("set(42)") {
@ -69,6 +74,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<int>() == 42); REQUIRE(variant.as<int>() == 42);
REQUIRE(variant.as<unsigned int>() == 42U); // issue #1601 REQUIRE(variant.as<unsigned int>() == 42U); // issue #1601
REQUIRE(variant.as<std::string>() == "42"); REQUIRE(variant.as<std::string>() == "42");
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(42L)") { SECTION("set(42L)") {
@ -77,6 +83,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<bool>() == true); REQUIRE(variant.as<bool>() == true);
REQUIRE(variant.as<double>() == 42.0); REQUIRE(variant.as<double>() == 42.0);
REQUIRE(variant.as<std::string>() == "42"); REQUIRE(variant.as<std::string>() == "42");
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(-42L)") { SECTION("set(-42L)") {
@ -84,6 +91,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<double>() == -42.0); REQUIRE(variant.as<double>() == -42.0);
REQUIRE(variant.as<std::string>() == "-42"); REQUIRE(variant.as<std::string>() == "-42");
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(42UL)") { SECTION("set(42UL)") {
@ -92,6 +100,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<bool>() == true); REQUIRE(variant.as<bool>() == true);
REQUIRE(variant.as<double>() == 42.0); REQUIRE(variant.as<double>() == 42.0);
REQUIRE(variant.as<std::string>() == "42"); REQUIRE(variant.as<std::string>() == "42");
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(0L)") { SECTION("set(0L)") {
@ -100,6 +109,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<bool>() == false); REQUIRE(variant.as<bool>() == false);
REQUIRE(variant.as<double>() == 0.0); REQUIRE(variant.as<double>() == 0.0);
REQUIRE(variant.as<std::string>() == "0"); REQUIRE(variant.as<std::string>() == "0");
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(0UL)") { SECTION("set(0UL)") {
@ -108,6 +118,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<bool>() == false); REQUIRE(variant.as<bool>() == false);
REQUIRE(variant.as<double>() == 0.0); REQUIRE(variant.as<double>() == 0.0);
REQUIRE(variant.as<std::string>() == "0"); REQUIRE(variant.as<std::string>() == "0");
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(null)") { SECTION("set(null)") {
@ -117,12 +128,14 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<double>() == 0.0); REQUIRE(variant.as<double>() == 0.0);
REQUIRE(variant.as<long>() == 0L); REQUIRE(variant.as<long>() == 0L);
REQUIRE(variant.as<std::string>() == "null"); REQUIRE(variant.as<std::string>() == "null");
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(\"42\")") { SECTION("set(\"42\")") {
variant.set("42"); variant.set("42");
REQUIRE(variant.as<long>() == 42L); REQUIRE(variant.as<long>() == 42L);
REQUIRE(variant.as<JsonString>() == "42");
} }
SECTION("set(\"hello\")") { SECTION("set(\"hello\")") {
@ -133,6 +146,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<const char*>() == std::string("hello")); REQUIRE(variant.as<const char*>() == std::string("hello"));
REQUIRE(variant.as<const char*>() == std::string("hello")); REQUIRE(variant.as<const char*>() == std::string("hello"));
REQUIRE(variant.as<std::string>() == std::string("hello")); REQUIRE(variant.as<std::string>() == std::string("hello"));
REQUIRE(variant.as<JsonString>() == "hello");
} }
SECTION("set(std::string(\"4.2\"))") { SECTION("set(std::string(\"4.2\"))") {
@ -143,6 +157,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<double>() == 4.2); REQUIRE(variant.as<double>() == 4.2);
REQUIRE(variant.as<const char*>() == std::string("4.2")); REQUIRE(variant.as<const char*>() == std::string("4.2"));
REQUIRE(variant.as<std::string>() == std::string("4.2")); REQUIRE(variant.as<std::string>() == std::string("4.2"));
REQUIRE(variant.as<JsonString>() == "4.2");
} }
SECTION("set(\"true\")") { SECTION("set(\"true\")") {
@ -150,6 +165,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<bool>() == true); REQUIRE(variant.as<bool>() == true);
REQUIRE(variant.as<int>() == 0); REQUIRE(variant.as<int>() == 0);
REQUIRE(variant.as<JsonString>() == "true");
} }
SECTION("set(-1e300)") { SECTION("set(-1e300)") {
@ -159,6 +175,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<double>() == -1e300); REQUIRE(variant.as<double>() == -1e300);
REQUIRE(variant.as<float>() < 0); REQUIRE(variant.as<float>() < 0);
REQUIRE(my::isinf(variant.as<float>())); REQUIRE(my::isinf(variant.as<float>()));
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(1e300)") { SECTION("set(1e300)") {
@ -168,6 +185,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<double>() == 1e300); REQUIRE(variant.as<double>() == 1e300);
REQUIRE(variant.as<float>() > 0); REQUIRE(variant.as<float>() > 0);
REQUIRE(my::isinf(variant.as<float>())); REQUIRE(my::isinf(variant.as<float>()));
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("set(1e-300)") { SECTION("set(1e-300)") {
@ -176,6 +194,7 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(variant.as<bool>() == true); REQUIRE(variant.as<bool>() == true);
REQUIRE(variant.as<double>() == 1e-300); REQUIRE(variant.as<double>() == 1e-300);
REQUIRE(variant.as<float>() == 0); REQUIRE(variant.as<float>() == 0);
REQUIRE(variant.as<JsonString>().isNull());
} }
SECTION("to<JsonObject>()") { SECTION("to<JsonObject>()") {

View File

@ -129,6 +129,18 @@ struct Converter<const char*> {
} }
}; };
template <>
struct Converter<String> {
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 <typename T> template <typename T>
inline typename enable_if<IsString<T>::value, bool>::type convertToJson( inline typename enable_if<IsString<T>::value, bool>::type convertToJson(
const T& src, VariantRef dst) { const T& src, VariantRef dst) {