summaryrefslogtreecommitdiff
path: root/include/lib/ArduinoJson/JsonObject.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/lib/ArduinoJson/JsonObject.hpp')
-rw-r--r--include/lib/ArduinoJson/JsonObject.hpp328
1 files changed, 328 insertions, 0 deletions
diff --git a/include/lib/ArduinoJson/JsonObject.hpp b/include/lib/ArduinoJson/JsonObject.hpp
new file mode 100644
index 0000000..caf698a
--- /dev/null
+++ b/include/lib/ArduinoJson/JsonObject.hpp
@@ -0,0 +1,328 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2018
+// MIT License
+
+#pragma once
+
+#include "Data/JsonBufferAllocated.hpp"
+#include "Data/List.hpp"
+#include "Data/ReferenceType.hpp"
+#include "Data/ValueSaver.hpp"
+#include "JsonPair.hpp"
+#include "Serialization/JsonPrintable.hpp"
+#include "StringTraits/StringTraits.hpp"
+#include "TypeTraits/EnableIf.hpp"
+#include "TypeTraits/IsArray.hpp"
+#include "TypeTraits/IsFloatingPoint.hpp"
+#include "TypeTraits/IsSame.hpp"
+
+// Returns the size (in bytes) of an object with n elements.
+// Can be very handy to determine the size of a StaticJsonBuffer.
+#define JSON_OBJECT_SIZE(NUMBER_OF_ELEMENTS) \
+ (sizeof(JsonObject) + (NUMBER_OF_ELEMENTS) * sizeof(JsonObject::node_type))
+
+namespace ArduinoJson {
+
+// Forward declarations
+class JsonArray;
+class JsonBuffer;
+namespace Internals {
+template <typename>
+class JsonObjectSubscript;
+}
+
+// A dictionary of JsonVariant indexed by string (char*)
+//
+// The constructor is private, instances must be created via
+// JsonBuffer::createObject() or JsonBuffer::parseObject().
+// A JsonObject can be serialized to a JSON string via JsonObject::printTo().
+// It can also be deserialized from a JSON string via JsonBuffer::parseObject().
+class JsonObject : public Internals::JsonPrintable<JsonObject>,
+ public Internals::ReferenceType,
+ public Internals::NonCopyable,
+ public Internals::List<JsonPair>,
+ public Internals::JsonBufferAllocated {
+ public:
+ // Create an empty JsonArray attached to the specified JsonBuffer.
+ // You should not use this constructor directly.
+ // Instead, use JsonBuffer::createObject() or JsonBuffer.parseObject().
+ explicit JsonObject(JsonBuffer* buffer) throw()
+ : Internals::List<JsonPair>(buffer) {}
+
+ // Gets or sets the value associated with the specified key.
+ //
+ // JsonObjectSubscript operator[](TKey)
+ // TKey = const std::string&, const String&
+ template <typename TString>
+ Internals::JsonObjectSubscript<const TString&> operator[](
+ const TString& key) {
+ return Internals::JsonObjectSubscript<const TString&>(*this, key);
+ }
+ //
+ // JsonObjectSubscript operator[](TKey)
+ // TKey = char*, const char*, char[], const char[N], const FlashStringHelper*
+ template <typename TString>
+ Internals::JsonObjectSubscript<TString*> operator[](TString* key) {
+ return Internals::JsonObjectSubscript<TString*>(*this, key);
+ }
+
+ // Gets the value associated with the specified key.
+ //
+ // const JsonObjectSubscript operator[](TKey) const;
+ // TKey = const std::string&, const String&
+ template <typename TString>
+ const Internals::JsonObjectSubscript<const TString&> operator[](
+ const TString& key) const {
+ return Internals::JsonObjectSubscript<const TString&>(
+ *const_cast<JsonObject*>(this), key);
+ }
+ //
+ // const JsonObjectSubscript operator[](TKey) const;
+ // TKey = const char*, const char[N], const FlashStringHelper*
+ template <typename TString>
+ const Internals::JsonObjectSubscript<TString*> operator[](
+ TString* key) const {
+ return Internals::JsonObjectSubscript<TString*>(
+ *const_cast<JsonObject*>(this), key);
+ }
+
+ // Sets the specified key with the specified value.
+ //
+ // bool set(TKey, TValue);
+ // TKey = const std::string&, const String&
+ // TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
+ // std::string, String, JsonArray, JsonObject
+ template <typename TValue, typename TString>
+ bool set(const TString& key, const TValue& value) {
+ return set_impl<const TString&, const TValue&>(key, value);
+ }
+ //
+ // bool set(TKey, TValue);
+ // TKey = const std::string&, const String&
+ // TValue = char*, const char*, const FlashStringHelper*
+ template <typename TValue, typename TString>
+ bool set(const TString& key, TValue* value) {
+ return set_impl<const TString&, TValue*>(key, value);
+ }
+ //
+ // bool set(TKey, const TValue&);
+ // TKey = char*, const char*, const FlashStringHelper*
+ // TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
+ // std::string, String, JsonArray, JsonObject
+ template <typename TValue, typename TString>
+ bool set(TString* key, const TValue& value) {
+ return set_impl<TString*, const TValue&>(key, value);
+ }
+ //
+ // bool set(TKey, TValue);
+ // TKey = char*, const char*, const FlashStringHelper*
+ // TValue = char*, const char*, const FlashStringHelper*
+ template <typename TValue, typename TString>
+ bool set(TString* key, TValue* value) {
+ return set_impl<TString*, TValue*>(key, value);
+ }
+ //
+ // bool set(TKey, TValue, uint8_t decimals);
+ // TKey = const std::string&, const String&
+ // TValue = float, double
+ template <typename TValue, typename TString>
+ DEPRECATED("Second argument is not supported anymore")
+ typename Internals::EnableIf<Internals::IsFloatingPoint<TValue>::value,
+ bool>::type
+ set(const TString& key, TValue value, uint8_t) {
+ return set_impl<const TString&, const JsonVariant&>(key,
+ JsonVariant(value));
+ }
+ //
+ // bool set(TKey, TValue, uint8_t decimals);
+ // TKey = char*, const char*, const FlashStringHelper*
+ // TValue = float, double
+ template <typename TValue, typename TString>
+ DEPRECATED("Second argument is not supported anymore")
+ typename Internals::EnableIf<Internals::IsFloatingPoint<TValue>::value,
+ bool>::type
+ set(TString* key, TValue value, uint8_t) {
+ return set_impl<TString*, const JsonVariant&>(key, JsonVariant(value));
+ }
+
+ // Gets the value associated with the specified key.
+ //
+ // TValue get<TValue>(TKey) const;
+ // TKey = const std::string&, const String&
+ // TValue = bool, char, long, int, short, float, double,
+ // std::string, String, JsonArray, JsonObject
+ template <typename TValue, typename TString>
+ typename Internals::JsonVariantAs<TValue>::type get(
+ const TString& key) const {
+ return get_impl<const TString&, TValue>(key);
+ }
+ //
+ // TValue get<TValue>(TKey) const;
+ // TKey = char*, const char*, const FlashStringHelper*
+ // TValue = bool, char, long, int, short, float, double,
+ // std::string, String, JsonArray, JsonObject
+ template <typename TValue, typename TString>
+ typename Internals::JsonVariantAs<TValue>::type get(TString* key) const {
+ return get_impl<TString*, TValue>(key);
+ }
+
+ // Checks the type of the value associated with the specified key.
+ //
+ //
+ // bool is<TValue>(TKey) const;
+ // TKey = const std::string&, const String&
+ // TValue = bool, char, long, int, short, float, double,
+ // std::string, String, JsonArray, JsonObject
+ template <typename TValue, typename TString>
+ bool is(const TString& key) const {
+ return is_impl<const TString&, TValue>(key);
+ }
+ //
+ // bool is<TValue>(TKey) const;
+ // TKey = char*, const char*, const FlashStringHelper*
+ // TValue = bool, char, long, int, short, float, double,
+ // std::string, String, JsonArray, JsonObject
+ template <typename TValue, typename TString>
+ bool is(TString* key) const {
+ return is_impl<TString*, TValue>(key);
+ }
+
+ // Creates and adds a JsonArray.
+ //
+ // JsonArray& createNestedArray(TKey);
+ // TKey = const std::string&, const String&
+ template <typename TString>
+ JsonArray& createNestedArray(const TString& key) {
+ return createNestedArray_impl<const TString&>(key);
+ }
+ // JsonArray& createNestedArray(TKey);
+ // TKey = char*, const char*, char[], const char[], const FlashStringHelper*
+ template <typename TString>
+ JsonArray& createNestedArray(TString* key) {
+ return createNestedArray_impl<TString*>(key);
+ }
+
+ // Creates and adds a JsonObject.
+ //
+ // JsonObject& createNestedObject(TKey);
+ // TKey = const std::string&, const String&
+ template <typename TString>
+ JsonObject& createNestedObject(const TString& key) {
+ return createNestedObject_impl<const TString&>(key);
+ }
+ //
+ // JsonObject& createNestedObject(TKey);
+ // TKey = char*, const char*, char[], const char[], const FlashStringHelper*
+ template <typename TString>
+ JsonObject& createNestedObject(TString* key) {
+ return createNestedObject_impl<TString*>(key);
+ }
+
+ // Tells weither the specified key is present and associated with a value.
+ //
+ // bool containsKey(TKey);
+ // TKey = const std::string&, const String&
+ template <typename TString>
+ bool containsKey(const TString& key) const {
+ return findKey<const TString&>(key) != end();
+ }
+ //
+ // bool containsKey(TKey);
+ // TKey = char*, const char*, char[], const char[], const FlashStringHelper*
+ template <typename TString>
+ bool containsKey(TString* key) const {
+ return findKey<TString*>(key) != end();
+ }
+
+ // Removes the specified key and the associated value.
+ //
+ // void remove(TKey);
+ // TKey = const std::string&, const String&
+ template <typename TString>
+ void remove(const TString& key) {
+ remove(findKey<const TString&>(key));
+ }
+ //
+ // void remove(TKey);
+ // TKey = char*, const char*, char[], const char[], const FlashStringHelper*
+ template <typename TString>
+ void remove(TString* key) {
+ remove(findKey<TString*>(key));
+ }
+ //
+ // void remove(iterator)
+ using Internals::List<JsonPair>::remove;
+
+ // Returns a reference an invalid JsonObject.
+ // This object is meant to replace a NULL pointer.
+ // This is used when memory allocation or JSON parsing fail.
+ static JsonObject& invalid() {
+ static JsonObject instance(NULL);
+ return instance;
+ }
+
+ private:
+ // Returns the list node that matches the specified key.
+ template <typename TStringRef>
+ iterator findKey(TStringRef key) {
+ iterator it;
+ for (it = begin(); it != end(); ++it) {
+ if (Internals::StringTraits<TStringRef>::equals(key, it->key)) break;
+ }
+ return it;
+ }
+ template <typename TStringRef>
+ const_iterator findKey(TStringRef key) const {
+ return const_cast<JsonObject*>(this)->findKey<TStringRef>(key);
+ }
+
+ template <typename TStringRef, typename TValue>
+ typename Internals::JsonVariantAs<TValue>::type get_impl(
+ TStringRef key) const {
+ const_iterator it = findKey<TStringRef>(key);
+ return it != end() ? it->value.as<TValue>()
+ : Internals::JsonVariantDefault<TValue>::get();
+ }
+
+ template <typename TStringRef, typename TValueRef>
+ bool set_impl(TStringRef key, TValueRef value) {
+ // ignore null key
+ if (Internals::StringTraits<TStringRef>::is_null(key)) return false;
+
+ // search a matching key
+ iterator it = findKey<TStringRef>(key);
+ if (it == end()) {
+ // add the key
+ it = Internals::List<JsonPair>::add();
+ if (it == end()) return false;
+ bool key_ok =
+ Internals::ValueSaver<TStringRef>::save(_buffer, it->key, key);
+ if (!key_ok) return false;
+ }
+
+ // save the value
+ return Internals::ValueSaver<TValueRef>::save(_buffer, it->value, value);
+ }
+
+ template <typename TStringRef, typename TValue>
+ bool is_impl(TStringRef key) const {
+ const_iterator it = findKey<TStringRef>(key);
+ return it != end() ? it->value.is<TValue>() : false;
+ }
+
+ template <typename TStringRef>
+ JsonArray& createNestedArray_impl(TStringRef key);
+
+ template <typename TStringRef>
+ JsonObject& createNestedObject_impl(TStringRef key);
+};
+
+namespace Internals {
+template <>
+struct JsonVariantDefault<JsonObject> {
+ static JsonObject& get() {
+ return JsonObject::invalid();
+ }
+};
+} // namespace Internals
+} // namespace ArduinoJson