fix: handle numeric values disguised as strings in JSON

closes #1104.
This commit is contained in:
Bernhard Kirchen 2024-07-13 22:49:10 +02:00 committed by Bernhard Kirchen
parent b90da210be
commit 9e7a0bca31

View File

@ -94,6 +94,24 @@ void Utils::removeAllFiles()
} }
/* OpenDTU-OnBatter-specific utils go here: */ /* OpenDTU-OnBatter-specific utils go here: */
template<typename T>
std::optional<T> getFromString(char const* val);
template<>
std::optional<float> getFromString(char const* val)
{
float res = 0;
try {
res = std::stof(val);
}
catch (std::invalid_argument const& e) {
return std::nullopt;
}
return res;
}
template<typename T> template<typename T>
std::pair<T, String> Utils::getJsonValueByPath(JsonDocument const& root, String const& path) std::pair<T, String> Utils::getJsonValueByPath(JsonDocument const& root, String const& path)
{ {
@ -156,13 +174,24 @@ std::pair<T, String> Utils::getJsonValueByPath(JsonDocument const& root, String
return { T(), String(errBuffer) }; return { T(), String(errBuffer) };
} }
if (!value.is<T>()) { if (value.is<T>()) {
return { value.as<T>(), "" };
}
if (!value.is<char const*>()) {
snprintf(errBuffer, kErrBufferSize, "Value '%s' at JSON path '%s' is not " snprintf(errBuffer, kErrBufferSize, "Value '%s' at JSON path '%s' is not "
"of the expected type", value.as<String>().c_str(), path.c_str()); "of the expected type", value.as<String>().c_str(), path.c_str());
return { T(), String(errBuffer) }; return { T(), String(errBuffer) };
} }
return { value.as<T>(), "" }; auto res = getFromString<T>(value.as<char const*>());
if (!res.has_value()) {
snprintf(errBuffer, kErrBufferSize, "String '%s' at JSON path '%s' cannot "
"be converted to the expected type", value.as<String>().c_str(), path.c_str());
return { T(), String(errBuffer) };
}
return { *res, "" };
} }
template std::pair<float, String> Utils::getJsonValueByPath(JsonDocument const& root, String const& path); template std::pair<float, String> Utils::getJsonValueByPath(JsonDocument const& root, String const& path);