// ArduinoJson - arduinojson.org // Copyright Benoit Blanchon 2014-2018 // MIT License #pragma once #include "Configuration.hpp" #include "JsonArray.hpp" #include "JsonObject.hpp" #include "JsonVariant.hpp" #include "Polyfills/isFloat.hpp" #include "Polyfills/isInteger.hpp" #include "Polyfills/parseFloat.hpp" #include "Polyfills/parseInteger.hpp" #include // for strcmp namespace ArduinoJson { inline JsonVariant::JsonVariant(const JsonArray &array) { if (array.success()) { _type = Internals::JSON_ARRAY; _content.asArray = const_cast(&array); } else { _type = Internals::JSON_UNDEFINED; } } inline JsonVariant::JsonVariant(const JsonObject &object) { if (object.success()) { _type = Internals::JSON_OBJECT; _content.asObject = const_cast(&object); } else { _type = Internals::JSON_UNDEFINED; } } inline JsonArray &JsonVariant::variantAsArray() const { if (_type == Internals::JSON_ARRAY) return *_content.asArray; return JsonArray::invalid(); } inline JsonObject &JsonVariant::variantAsObject() const { if (_type == Internals::JSON_OBJECT) return *_content.asObject; return JsonObject::invalid(); } template inline T JsonVariant::variantAsInteger() const { using namespace Internals; switch (_type) { case JSON_UNDEFINED: return 0; case JSON_POSITIVE_INTEGER: case JSON_BOOLEAN: return T(_content.asInteger); case JSON_NEGATIVE_INTEGER: return T(~_content.asInteger + 1); case JSON_STRING: case JSON_UNPARSED: return parseInteger(_content.asString); default: return T(_content.asFloat); } } inline const char *JsonVariant::variantAsString() const { using namespace Internals; if (_type == JSON_UNPARSED && _content.asString && !strcmp("null", _content.asString)) return NULL; if (_type == JSON_STRING || _type == JSON_UNPARSED) return _content.asString; return NULL; } template inline T JsonVariant::variantAsFloat() const { using namespace Internals; switch (_type) { case JSON_UNDEFINED: return 0; case JSON_POSITIVE_INTEGER: case JSON_BOOLEAN: return static_cast(_content.asInteger); case JSON_NEGATIVE_INTEGER: return -static_cast(_content.asInteger); case JSON_STRING: case JSON_UNPARSED: return parseFloat(_content.asString); default: return static_cast(_content.asFloat); } } inline bool JsonVariant::variantIsBoolean() const { using namespace Internals; if (_type == JSON_BOOLEAN) return true; if (_type != JSON_UNPARSED || _content.asString == NULL) return false; return !strcmp(_content.asString, "true") || !strcmp(_content.asString, "false"); } inline bool JsonVariant::variantIsInteger() const { using namespace Internals; return _type == JSON_POSITIVE_INTEGER || _type == JSON_NEGATIVE_INTEGER || (_type == JSON_UNPARSED && isInteger(_content.asString)); } inline bool JsonVariant::variantIsFloat() const { using namespace Internals; return _type == JSON_FLOAT || _type == JSON_POSITIVE_INTEGER || _type == JSON_NEGATIVE_INTEGER || (_type == JSON_UNPARSED && isFloat(_content.asString)); } #if ARDUINOJSON_ENABLE_STD_STREAM inline std::ostream &operator<<(std::ostream &os, const JsonVariant &source) { return source.printTo(os); } #endif } // namespace ArduinoJson