From 9d427982cc670b8dd93bef144464ad7babb64471 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 10 Mar 2022 18:26:37 +0100 Subject: [PATCH] Fix is() and getMember() --- extras/tests/JsonVariant/link.cpp | 10 +++++----- src/ArduinoJson/Object/ObjectRef.hpp | 2 +- src/ArduinoJson/Variant/VariantData.hpp | 18 +++++++++++++++++- src/ArduinoJson/Variant/VariantRef.hpp | 14 ++++++++------ 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/extras/tests/JsonVariant/link.cpp b/extras/tests/JsonVariant/link.cpp index e8504209..66421520 100644 --- a/extras/tests/JsonVariant/link.cpp +++ b/extras/tests/JsonVariant/link.cpp @@ -60,16 +60,16 @@ TEST_CASE("Linked document") { // TODO: move in size.cpp SECTION("size()") { - CHECK(doc1.size() == 1); + CHECK(variant.size() == 1); } SECTION("is()") { - CHECK(doc1.is() == false); - CHECK(doc1.is() == true); - CHECK(doc1.is() == false); + CHECK(variant.is() == false); + CHECK(variant.is() == true); + CHECK(variant.is() == false); } SECTION("get member") { - CHECK(doc1["hello"].as() == "world"); + CHECK(variant["hello"].as() == "world"); } } diff --git a/src/ArduinoJson/Object/ObjectRef.hpp b/src/ArduinoJson/Object/ObjectRef.hpp index 6cf9c14d..8ea33dfe 100644 --- a/src/ArduinoJson/Object/ObjectRef.hpp +++ b/src/ArduinoJson/Object/ObjectRef.hpp @@ -276,7 +276,7 @@ struct Converter { static bool checkJson(VariantRef src) { VariantData* data = getData(src); - return data && data->isObject(); + return data && data->isObjectStrict(); } }; } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 74fe6074..dc8e6fdf 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -100,6 +100,8 @@ class VariantData { } const CollectionData *asObject() const { + if (isPointer()) + return _content.asPointer->asObject(); return const_cast(this)->asObject(); } @@ -144,6 +146,12 @@ class VariantData { } bool isObject() const { + if (isPointer()) + return _content.asPointer->isObject(); + return isObjectStrict(); + } + + bool isObjectStrict() const { return (_flags & VALUE_IS_OBJECT) != 0; } @@ -166,6 +174,13 @@ class VariantData { _content.asCollection.removeMember(key); } + const VariantData *resolve() const { + if (isPointer()) + return _content.asPointer->resolve(); + else + return this; + } + void setBoolean(bool value) { setType(VALUE_IS_BOOLEAN); _content.asBoolean = value; @@ -290,7 +305,8 @@ class VariantData { template VariantData *getMember(TAdaptedString key) const { - return isObject() ? _content.asCollection.getMember(key) : 0; + const CollectionData *col = asObject(); + return col ? col->getMember(key) : 0; } template diff --git a/src/ArduinoJson/Variant/VariantRef.hpp b/src/ArduinoJson/Variant/VariantRef.hpp index c48a40fc..7f1dcd8c 100644 --- a/src/ArduinoJson/Variant/VariantRef.hpp +++ b/src/ArduinoJson/Variant/VariantRef.hpp @@ -52,13 +52,15 @@ class VariantRefBase : public VariantTag { VariantRefBase(TData *data) : _data(data) {} TData *_data; + // const TData *getData() const { + // const TData *data = _data; + // if (!_data) + // return 0; + // return _data->resolve(); + // } + friend TData *getData(const VariantRefBase &variant) { - TData *data = variant._data; - if (!data) - return 0; - while (data->isPointer()) - data = data->asPointer; // TODO: test multiple levels - return data; + return variant._data; } };