From 434e90025d93a29767ba3899bc6c677f8a79bab2 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Sun, 15 Jun 2025 12:34:38 +0200 Subject: [PATCH] JsonObjectConst: replace `ObjectData*` member with `VariantData*` --- src/ArduinoJson/Object/JsonObject.hpp | 2 +- src/ArduinoJson/Object/JsonObjectConst.hpp | 27 ++++++++++--------- src/ArduinoJson/Variant/ConverterImpl.hpp | 4 +-- .../Variant/JsonVariantVisitor.hpp | 3 ++- src/ArduinoJson/Variant/VariantData.hpp | 4 +++ 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/ArduinoJson/Object/JsonObject.hpp b/src/ArduinoJson/Object/JsonObject.hpp index 662851b1..d55ac38b 100644 --- a/src/ArduinoJson/Object/JsonObject.hpp +++ b/src/ArduinoJson/Object/JsonObject.hpp @@ -33,7 +33,7 @@ class JsonObject : public detail::VariantOperators { } operator JsonObjectConst() const { - return JsonObjectConst(data_, resources_); + return JsonObjectConst(collectionToVariant(data_), resources_); } operator JsonVariantConst() const { diff --git a/src/ArduinoJson/Object/JsonObjectConst.hpp b/src/ArduinoJson/Object/JsonObjectConst.hpp index 99540c41..099249d8 100644 --- a/src/ArduinoJson/Object/JsonObjectConst.hpp +++ b/src/ArduinoJson/Object/JsonObjectConst.hpp @@ -22,7 +22,7 @@ class JsonObjectConst : public detail::VariantOperators { JsonObjectConst() : data_(0), resources_(0) {} // INTERNAL USE ONLY - JsonObjectConst(const detail::ObjectData* data, + JsonObjectConst(const detail::VariantData* data, const detail::ResourceManager* resources) : data_(data), resources_(resources) {} @@ -33,13 +33,13 @@ class JsonObjectConst : public detail::VariantOperators { // Returns true if the reference is unbound. // https://arduinojson.org/v7/api/jsonobjectconst/isnull/ bool isNull() const { - return data_ == 0; + return !data_ || !data_->isObject(); } // Returns true if the reference is bound. // https://arduinojson.org/v7/api/jsonobjectconst/isnull/ operator bool() const { - return data_ != 0; + return !isNull(); } // Returns the depth (nesting level) of the object. @@ -57,9 +57,10 @@ class JsonObjectConst : public detail::VariantOperators { // Returns an iterator to the first key-value pair of the object. // https://arduinojson.org/v7/api/jsonobjectconst/begin/ iterator begin() const { - if (!data_) + auto obj = detail::VariantData::asObject(data_); + if (!obj) return iterator(); - return iterator(data_->createIterator(resources_), resources_); + return iterator(obj->createIterator(resources_), resources_); } // Returns an iterator following the last key-value pair of the object. @@ -74,8 +75,8 @@ class JsonObjectConst : public detail::VariantOperators { detail::enable_if_t::value, int> = 0> ARDUINOJSON_DEPRECATED("use obj[key].is() instead") bool containsKey(const TString& key) const { - return detail::ObjectData::getMember(data_, detail::adaptString(key), - resources_) != 0; + return detail::VariantData::getMember(data_, detail::adaptString(key), + resources_) != 0; } // DEPRECATED: use obj["key"].is() instead @@ -83,8 +84,8 @@ class JsonObjectConst : public detail::VariantOperators { template ARDUINOJSON_DEPRECATED("use obj[\"key\"].is() instead") bool containsKey(TChar* key) const { - return detail::ObjectData::getMember(data_, detail::adaptString(key), - resources_) != 0; + return detail::VariantData::getMember(data_, detail::adaptString(key), + resources_) != 0; } // DEPRECATED: use obj[key].is() instead @@ -101,7 +102,7 @@ class JsonObjectConst : public detail::VariantOperators { template ::value, int> = 0> JsonVariantConst operator[](const TString& key) const { - return JsonVariantConst(detail::ObjectData::getMember( + return JsonVariantConst(detail::VariantData::getMember( data_, detail::adaptString(key), resources_), resources_); } @@ -113,7 +114,7 @@ class JsonObjectConst : public detail::VariantOperators { !detail::is_const::value, int> = 0> JsonVariantConst operator[](TChar* key) const { - return JsonVariantConst(detail::ObjectData::getMember( + return JsonVariantConst(detail::VariantData::getMember( data_, detail::adaptString(key), resources_), resources_); } @@ -137,10 +138,10 @@ class JsonObjectConst : public detail::VariantOperators { private: const detail::VariantData* getData() const { - return collectionToVariant(data_); + return data_; } - const detail::ObjectData* data_; + const detail::VariantData* data_; const detail::ResourceManager* resources_; }; diff --git a/src/ArduinoJson/Variant/ConverterImpl.hpp b/src/ArduinoJson/Variant/ConverterImpl.hpp index 20c8f770..b995a075 100644 --- a/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -369,9 +369,7 @@ struct Converter : private detail::VariantAttorney { } static JsonObjectConst fromJson(JsonVariantConst src) { - auto data = getData(src); - auto object = data != 0 ? data->asObject() : nullptr; - return JsonObjectConst(object, getResourceManager(src)); + return JsonObjectConst(getData(src), getResourceManager(src)); } static bool checkJson(JsonVariantConst src) { diff --git a/src/ArduinoJson/Variant/JsonVariantVisitor.hpp b/src/ArduinoJson/Variant/JsonVariantVisitor.hpp index 65185568..5bf0fdf3 100644 --- a/src/ArduinoJson/Variant/JsonVariantVisitor.hpp +++ b/src/ArduinoJson/Variant/JsonVariantVisitor.hpp @@ -35,7 +35,8 @@ class VisitorAdapter { } result_type visit(const ObjectData& value) { - return visitor_->visit(JsonObjectConst(&value, resources_)); + return visitor_->visit( + JsonObjectConst(collectionToVariant(&value), resources_)); } template diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 7c82ed90..09185cc8 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -292,6 +292,10 @@ class VariantData { return const_cast(this)->asObject(); } + static const ObjectData* asObject(const VariantData* var) { + return var ? var->asObject() : 0; + } + JsonString asRawString() const { switch (type_) { case VariantType::RawString: