JsonObject: replace ObjectData* member with VariantData*

This commit is contained in:
Benoit Blanchon
2025-06-15 12:55:13 +02:00
parent 7f0cca379a
commit 2feb07dc15
3 changed files with 31 additions and 26 deletions

View File

@ -23,7 +23,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
JsonObject() : data_(0), resources_(0) {} JsonObject() : data_(0), resources_(0) {}
// INTERNAL USE ONLY // INTERNAL USE ONLY
JsonObject(detail::ObjectData* data, detail::ResourceManager* resource) JsonObject(detail::VariantData* data, detail::ResourceManager* resource)
: data_(data), resources_(resource) {} : data_(data), resources_(resource) {}
operator JsonVariant() const { operator JsonVariant() const {
@ -33,29 +33,29 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
} }
operator JsonObjectConst() const { operator JsonObjectConst() const {
return JsonObjectConst(collectionToVariant(data_), resources_); return JsonObjectConst(data_, resources_);
} }
operator JsonVariantConst() const { operator JsonVariantConst() const {
return JsonVariantConst(collectionToVariant(data_), resources_); return JsonVariantConst(data_, resources_);
} }
// Returns true if the reference is unbound. // Returns true if the reference is unbound.
// https://arduinojson.org/v7/api/jsonobject/isnull/ // https://arduinojson.org/v7/api/jsonobject/isnull/
bool isNull() const { bool isNull() const {
return data_ == 0; return !data_ || !data_->isObject();
} }
// Returns true if the reference is bound. // Returns true if the reference is bound.
// https://arduinojson.org/v7/api/jsonobject/isnull/ // https://arduinojson.org/v7/api/jsonobject/isnull/
operator bool() const { operator bool() const {
return data_ != 0; return !isNull();
} }
// Returns the depth (nesting level) of the object. // Returns the depth (nesting level) of the object.
// https://arduinojson.org/v7/api/jsonobject/nesting/ // https://arduinojson.org/v7/api/jsonobject/nesting/
size_t nesting() const { size_t nesting() const {
return detail::VariantData::nesting(collectionToVariant(data_), resources_); return detail::VariantData::nesting(data_, resources_);
} }
// Returns the number of members in the object. // Returns the number of members in the object.
@ -67,9 +67,10 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
// Returns an iterator to the first key-value pair of the object. // Returns an iterator to the first key-value pair of the object.
// https://arduinojson.org/v7/api/jsonobject/begin/ // https://arduinojson.org/v7/api/jsonobject/begin/
iterator begin() const { iterator begin() const {
if (!data_) auto obj = detail::VariantData::asObject(data_);
if (!obj)
return iterator(); 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. // Returns an iterator following the last key-value pair of the object.
@ -81,7 +82,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
// Removes all the members of the object. // Removes all the members of the object.
// https://arduinojson.org/v7/api/jsonobject/clear/ // https://arduinojson.org/v7/api/jsonobject/clear/
void clear() const { void clear() const {
detail::ObjectData::clear(data_, resources_); detail::ObjectData::clear(detail::VariantData::asObject(data_), resources_);
} }
// Copies an object. // Copies an object.
@ -131,7 +132,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
// Removes the member at the specified iterator. // Removes the member at the specified iterator.
// https://arduinojson.org/v7/api/jsonobject/remove/ // https://arduinojson.org/v7/api/jsonobject/remove/
FORCE_INLINE void remove(iterator it) const { FORCE_INLINE void remove(iterator it) const {
detail::ObjectData::remove(data_, it.iterator_, resources_); detail::ObjectData::remove(detail::VariantData::asObject(data_),
it.iterator_, resources_);
} }
// Removes the member with the specified key. // Removes the member with the specified key.
@ -139,8 +141,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
template <typename TString, template <typename TString,
detail::enable_if_t<detail::IsString<TString>::value, int> = 0> detail::enable_if_t<detail::IsString<TString>::value, int> = 0>
void remove(const TString& key) const { void remove(const TString& key) const {
detail::ObjectData::removeMember(data_, detail::adaptString(key), detail::VariantData::removeMember(data_, detail::adaptString(key),
resources_); resources_);
} }
// Removes the member with the specified key. // Removes the member with the specified key.
@ -156,8 +158,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
// https://arduinojson.org/v7/api/jsonobject/remove/ // https://arduinojson.org/v7/api/jsonobject/remove/
template <typename TChar> template <typename TChar>
FORCE_INLINE void remove(TChar* key) const { FORCE_INLINE void remove(TChar* key) const {
detail::ObjectData::removeMember(data_, detail::adaptString(key), detail::VariantData::removeMember(data_, detail::adaptString(key),
resources_); resources_);
} }
// DEPRECATED: use obj[key].is<T>() instead // DEPRECATED: use obj[key].is<T>() instead
@ -166,8 +168,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
detail::enable_if_t<detail::IsString<TString>::value, int> = 0> detail::enable_if_t<detail::IsString<TString>::value, int> = 0>
ARDUINOJSON_DEPRECATED("use obj[key].is<T>() instead") ARDUINOJSON_DEPRECATED("use obj[key].is<T>() instead")
bool containsKey(const TString& key) const { bool containsKey(const TString& key) const {
return detail::ObjectData::getMember(data_, detail::adaptString(key), return detail::VariantData::getMember(data_, detail::adaptString(key),
resources_) != 0; resources_) != 0;
} }
// DEPRECATED: use obj["key"].is<T>() instead // DEPRECATED: use obj["key"].is<T>() instead
@ -178,8 +180,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
int> = 0> int> = 0>
ARDUINOJSON_DEPRECATED("use obj[\"key\"].is<T>() instead") ARDUINOJSON_DEPRECATED("use obj[\"key\"].is<T>() instead")
bool containsKey(TChar* key) const { bool containsKey(TChar* key) const {
return detail::ObjectData::getMember(data_, detail::adaptString(key), return detail::VariantData::getMember(data_, detail::adaptString(key),
resources_) != 0; resources_) != 0;
} }
// DEPRECATED: use obj[key].is<T>() instead // DEPRECATED: use obj[key].is<T>() instead
@ -231,14 +233,14 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
} }
detail::VariantData* getData() const { detail::VariantData* getData() const {
return detail::collectionToVariant(data_); return data_;
} }
detail::VariantData* getOrCreateData() const { detail::VariantData* getOrCreateData() const {
return detail::collectionToVariant(data_); return data_;
} }
detail::ObjectData* data_; detail::VariantData* data_;
detail::ResourceManager* resources_; detail::ResourceManager* resources_;
}; };

View File

@ -386,9 +386,7 @@ struct Converter<JsonObject> : private detail::VariantAttorney {
} }
static JsonObject fromJson(JsonVariant src) { static JsonObject fromJson(JsonVariant src) {
auto data = getData(src); return JsonObject(getData(src), getResourceManager(src));
auto resources = getResourceManager(src);
return JsonObject(data != 0 ? data->asObject() : 0, resources);
} }
static bool checkJson(JsonVariant src) { static bool checkJson(JsonVariant src) {

View File

@ -296,6 +296,10 @@ class VariantData {
return const_cast<VariantData*>(this)->asObject(); return const_cast<VariantData*>(this)->asObject();
} }
static ObjectData* asObject(VariantData* var) {
return var ? var->asObject() : 0;
}
static const ObjectData* asObject(const VariantData* var) { static const ObjectData* asObject(const VariantData* var) {
return var ? var->asObject() : 0; return var ? var->asObject() : 0;
} }
@ -595,11 +599,12 @@ class VariantData {
return content_.asObject; return content_.asObject;
} }
static ObjectData* toObject(VariantData* var, ResourceManager* resources) { static VariantData* toObject(VariantData* var, ResourceManager* resources) {
if (!var) if (!var)
return 0; return 0;
var->clear(resources); var->clear(resources);
return &var->toObject(); var->toObject();
return var;
} }
VariantType type() const { VariantType type() const {