diff --git a/CHANGELOG.md b/CHANGELOG.md index e259b28e..c0f1786a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ HEAD * The copy constructor of `DynamicJsonDocument` chooses the capacity according to the memory usage of the source, not from the capacity of the source. * Added the ability to create/assign a `StaticJsonDocument`/`DynamicJsonDocument` from a `JsonArray`/`JsonObject`/`JsonVariant` * Added `JsonDocument::isNull()` +* Added `JsonDocument::operator[]` > ### BREAKING CHANGES > diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index a1ed8138..e386e775 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -9,6 +9,8 @@ #include "../Variant/VariantRef.hpp" #include "../Variant/VariantTo.hpp" +#include "../Array/ArraySubscript.hpp" + namespace ARDUINOJSON_NAMESPACE { class JsonDocument : public Visitable { @@ -79,6 +81,48 @@ class JsonDocument : public Visitable { return _data; } + // ObjectSubscript operator[](TKey) + // TKey = const std::string&, const String& + template + FORCE_INLINE typename enable_if::value, + ObjectSubscript >::type + operator[](const TKey& key) { + return getVariant()[key]; + } + + // ObjectSubscript operator[](TKey); + // TKey = const char*, const char[N], const __FlashStringHelper* + template + FORCE_INLINE + typename enable_if::value, ObjectSubscript >::type + operator[](TKey* key) { + return getVariant()[key]; + } + + // VariantConstRef operator[](TKey) const + // TKey = const std::string&, const String& + template + FORCE_INLINE typename enable_if::value, VariantConstRef>::type + operator[](const TKey& key) const { + return getVariant()[key]; + } + + // VariantConstRef operator[](TKey) const; + // TKey = const char*, const char[N], const __FlashStringHelper* + template + FORCE_INLINE typename enable_if::value, VariantConstRef>::type + operator[](TKey* key) const { + return getVariant()[key]; + } + + FORCE_INLINE ArraySubscript operator[](size_t index) { + return getVariant()[index]; + } + + FORCE_INLINE VariantConstRef operator[](size_t index) const { + return getVariant()[index]; + } + protected: JsonDocument(MemoryPool pool) : _pool(pool) { _data.setNull(); @@ -88,10 +132,6 @@ class JsonDocument : public Visitable { _data.setNull(); } - void copy(const JsonDocument& src) { - to().set(src.as()); - } - void replacePool(MemoryPool pool) { _pool = pool; } diff --git a/src/ArduinoJson/Operators/VariantSubscripts.hpp b/src/ArduinoJson/Operators/VariantSubscripts.hpp index 664534b4..ebc7585c 100644 --- a/src/ArduinoJson/Operators/VariantSubscripts.hpp +++ b/src/ArduinoJson/Operators/VariantSubscripts.hpp @@ -31,17 +31,17 @@ class VariantSubscripts { // // ObjectSubscript operator[](TKey) const; // TKey = const std::string&, const String& - template - FORCE_INLINE typename enable_if::value, - ObjectSubscript >::type - operator[](const TString &key) const; + template + FORCE_INLINE typename enable_if::value, + ObjectSubscript >::type + operator[](const TKey &key) const; // // ObjectSubscript operator[](TKey) const; // TKey = const char*, const char[N], const __FlashStringHelper* - template - FORCE_INLINE typename enable_if::value, - ObjectSubscript >::type - operator[](TString *key) const; + template + FORCE_INLINE typename enable_if::value, + ObjectSubscript >::type + operator[](TKey *key) const; private: const TImpl *impl() const { diff --git a/test/JsonDocument/CMakeLists.txt b/test/JsonDocument/CMakeLists.txt index 0eba8c25..9bf27806 100644 --- a/test/JsonDocument/CMakeLists.txt +++ b/test/JsonDocument/CMakeLists.txt @@ -7,6 +7,7 @@ add_executable(JsonDocumentTests nesting.cpp isNull.cpp StaticJsonDocument.cpp + subscript.cpp ) target_link_libraries(JsonDocumentTests catch) diff --git a/test/JsonDocument/subscript.cpp b/test/JsonDocument/subscript.cpp new file mode 100644 index 00000000..29c523c1 --- /dev/null +++ b/test/JsonDocument/subscript.cpp @@ -0,0 +1,32 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#include +#include + +TEST_CASE("JsonDocument::operator[]") { + DynamicJsonDocument doc(4096); + const JsonDocument& cdoc = doc; + + SECTION("object") { + deserializeJson(doc, "{\"hello\":\"world\"}"); + + SECTION("const char*") { + REQUIRE(doc["hello"] == "world"); + REQUIRE(cdoc["hello"] == "world"); + } + + SECTION("std::string") { + REQUIRE(doc[std::string("hello")] == "world"); + REQUIRE(cdoc[std::string("hello")] == "world"); + } + } + + SECTION("array") { + deserializeJson(doc, "[\"hello\",\"world\"]"); + + REQUIRE(doc[1] == "world"); + REQUIRE(cdoc[1] == "world"); + } +}