| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- // Copyright Benoit Blanchon 2014-2017
- // MIT License
- //
- // Arduino JSON library
- // https://github.com/bblanchon/ArduinoJson
- // If you like this project, please add a star!
- #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 <string.h> // for strcmp
- namespace ArduinoJson {
- inline JsonVariant::JsonVariant(const JsonArray &array) {
- if (array.success()) {
- _type = Internals::JSON_ARRAY;
- _content.asArray = const_cast<JsonArray *>(&array);
- } else {
- _type = Internals::JSON_UNDEFINED;
- }
- }
- inline JsonVariant::JsonVariant(const JsonObject &object) {
- if (object.success()) {
- _type = Internals::JSON_OBJECT;
- _content.asObject = const_cast<JsonObject *>(&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 <typename T>
- inline T JsonVariant::variantAsInteger() const {
- using namespace Internals;
- switch (_type) {
- case JSON_UNDEFINED:
- return 0;
- case JSON_POSITIVE_INTEGER:
- case JSON_BOOLEAN:
- return static_cast<T>(_content.asInteger);
- case JSON_NEGATIVE_INTEGER:
- return static_cast<T>(_content.asInteger * -1);
- case JSON_STRING:
- case JSON_UNPARSED:
- if (!_content.asString) return 0;
- if (!strcmp("true", _content.asString)) return 1;
- return Polyfills::parseInteger<T>(_content.asString);
- default:
- return static_cast<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 <typename T>
- 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<T>(_content.asInteger);
- case JSON_NEGATIVE_INTEGER:
- return -static_cast<T>(_content.asInteger);
- case JSON_STRING:
- case JSON_UNPARSED:
- return Polyfills::parseFloat<T>(_content.asString);
- default:
- return static_cast<T>(_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 && Polyfills::isInteger(_content.asString));
- }
- inline bool JsonVariant::variantIsFloat() const {
- using namespace Internals;
- return _type >= JSON_FLOAT_0_DECIMALS ||
- (_type == JSON_UNPARSED && Polyfills::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
|