Added JsonDocument::operator[]

This commit is contained in:
Benoit Blanchon
2019-01-23 11:43:29 +01:00
parent 4167b11434
commit 933a66a070
5 changed files with 86 additions and 12 deletions

View File

@ -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
>

View File

@ -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 <typename TKey>
FORCE_INLINE typename enable_if<IsString<TKey>::value,
ObjectSubscript<const TKey&> >::type
operator[](const TKey& key) {
return getVariant()[key];
}
// ObjectSubscript operator[](TKey);
// TKey = const char*, const char[N], const __FlashStringHelper*
template <typename TKey>
FORCE_INLINE
typename enable_if<IsString<TKey*>::value, ObjectSubscript<TKey*> >::type
operator[](TKey* key) {
return getVariant()[key];
}
// VariantConstRef operator[](TKey) const
// TKey = const std::string&, const String&
template <typename TKey>
FORCE_INLINE typename enable_if<IsString<TKey>::value, VariantConstRef>::type
operator[](const TKey& key) const {
return getVariant()[key];
}
// VariantConstRef operator[](TKey) const;
// TKey = const char*, const char[N], const __FlashStringHelper*
template <typename TKey>
FORCE_INLINE typename enable_if<IsString<TKey*>::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<VariantRef>().set(src.as<VariantRef>());
}
void replacePool(MemoryPool pool) {
_pool = pool;
}

View File

@ -31,17 +31,17 @@ class VariantSubscripts {
//
// ObjectSubscript operator[](TKey) const;
// TKey = const std::string&, const String&
template <typename TString>
FORCE_INLINE typename enable_if<IsString<TString>::value,
ObjectSubscript<const TString &> >::type
operator[](const TString &key) const;
template <typename TKey>
FORCE_INLINE typename enable_if<IsString<TKey>::value,
ObjectSubscript<const TKey &> >::type
operator[](const TKey &key) const;
//
// ObjectSubscript operator[](TKey) const;
// TKey = const char*, const char[N], const __FlashStringHelper*
template <typename TString>
FORCE_INLINE typename enable_if<IsString<TString *>::value,
ObjectSubscript<TString *> >::type
operator[](TString *key) const;
template <typename TKey>
FORCE_INLINE typename enable_if<IsString<TKey *>::value,
ObjectSubscript<TKey *> >::type
operator[](TKey *key) const;
private:
const TImpl *impl() const {

View File

@ -7,6 +7,7 @@ add_executable(JsonDocumentTests
nesting.cpp
isNull.cpp
StaticJsonDocument.cpp
subscript.cpp
)
target_link_libraries(JsonDocumentTests catch)

View File

@ -0,0 +1,32 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
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");
}
}