@@ -23,7 +23,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
2323 JsonObject () : data_(0 ), resources_(0 ) {}
2424
2525 // INTERNAL USE ONLY
26- JsonObject (detail::ObjectData * data, detail::ResourceManager* resource)
26+ JsonObject (detail::VariantData * data, detail::ResourceManager* resource)
2727 : data_(data), resources_(resource) {}
2828
2929 operator JsonVariant () const {
@@ -33,29 +33,29 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
3333 }
3434
3535 operator JsonObjectConst () const {
36- return JsonObjectConst (collectionToVariant ( data_) , resources_);
36+ return JsonObjectConst (data_, resources_);
3737 }
3838
3939 operator JsonVariantConst () const {
40- return JsonVariantConst (collectionToVariant ( data_) , resources_);
40+ return JsonVariantConst (data_, resources_);
4141 }
4242
4343 // Returns true if the reference is unbound.
4444 // https://arduinojson.org/v7/api/jsonobject/isnull/
4545 bool isNull () const {
46- return data_ == 0 ;
46+ return ! data_ || !data_-> isObject () ;
4747 }
4848
4949 // Returns true if the reference is bound.
5050 // https://arduinojson.org/v7/api/jsonobject/isnull/
5151 operator bool () const {
52- return data_ != 0 ;
52+ return ! isNull () ;
5353 }
5454
5555 // Returns the depth (nesting level) of the object.
5656 // https://arduinojson.org/v7/api/jsonobject/nesting/
5757 size_t nesting () const {
58- return detail::VariantData::nesting (collectionToVariant ( data_) , resources_);
58+ return detail::VariantData::nesting (data_, resources_);
5959 }
6060
6161 // Returns the number of members in the object.
@@ -67,9 +67,10 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
6767 // Returns an iterator to the first key-value pair of the object.
6868 // https://arduinojson.org/v7/api/jsonobject/begin/
6969 iterator begin () const {
70- if (!data_)
70+ auto obj = detail::VariantData::asObject (data_);
71+ if (!obj)
7172 return iterator ();
72- return iterator (data_ ->createIterator (resources_), resources_);
73+ return iterator (obj ->createIterator (resources_), resources_);
7374 }
7475
7576 // Returns an iterator following the last key-value pair of the object.
@@ -81,7 +82,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
8182 // Removes all the members of the object.
8283 // https://arduinojson.org/v7/api/jsonobject/clear/
8384 void clear () const {
84- detail::ObjectData::clear (data_, resources_);
85+ detail::ObjectData::clear (detail::VariantData::asObject ( data_) , resources_);
8586 }
8687
8788 // Copies an object.
@@ -131,16 +132,17 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
131132 // Removes the member at the specified iterator.
132133 // https://arduinojson.org/v7/api/jsonobject/remove/
133134 FORCE_INLINE void remove (iterator it) const {
134- detail::ObjectData::remove (data_, it.iterator_ , resources_);
135+ detail::ObjectData::remove (detail::VariantData::asObject (data_),
136+ it.iterator_ , resources_);
135137 }
136138
137139 // Removes the member with the specified key.
138140 // https://arduinojson.org/v7/api/jsonobject/remove/
139141 template <typename TString,
140142 detail::enable_if_t <detail::IsString<TString>::value, int > = 0 >
141143 void remove (const TString& key) const {
142- detail::ObjectData ::removeMember (data_, detail::adaptString (key),
143- resources_);
144+ detail::VariantData ::removeMember (data_, detail::adaptString (key),
145+ resources_);
144146 }
145147
146148 // Removes the member with the specified key.
@@ -156,8 +158,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
156158 // https://arduinojson.org/v7/api/jsonobject/remove/
157159 template <typename TChar>
158160 FORCE_INLINE void remove (TChar* key) const {
159- detail::ObjectData ::removeMember (data_, detail::adaptString (key),
160- resources_);
161+ detail::VariantData ::removeMember (data_, detail::adaptString (key),
162+ resources_);
161163 }
162164
163165 // DEPRECATED: use obj[key].is<T>() instead
@@ -166,8 +168,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
166168 detail::enable_if_t <detail::IsString<TString>::value, int > = 0 >
167169 ARDUINOJSON_DEPRECATED (" use obj[key].is<T>() instead" )
168170 bool containsKey (const TString& key) const {
169- return detail::ObjectData ::getMember (data_, detail::adaptString (key),
170- resources_) != 0 ;
171+ return detail::VariantData ::getMember (data_, detail::adaptString (key),
172+ resources_) != 0 ;
171173 }
172174
173175 // DEPRECATED: use obj["key"].is<T>() instead
@@ -178,8 +180,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
178180 int > = 0 >
179181 ARDUINOJSON_DEPRECATED (" use obj[\" key\" ].is<T>() instead" )
180182 bool containsKey (TChar* key) const {
181- return detail::ObjectData ::getMember (data_, detail::adaptString (key),
182- resources_) != 0 ;
183+ return detail::VariantData ::getMember (data_, detail::adaptString (key),
184+ resources_) != 0 ;
183185 }
184186
185187 // DEPRECATED: use obj[key].is<T>() instead
@@ -231,14 +233,14 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
231233 }
232234
233235 detail::VariantData* getData () const {
234- return detail::collectionToVariant ( data_) ;
236+ return data_;
235237 }
236238
237239 detail::VariantData* getOrCreateData () const {
238- return detail::collectionToVariant ( data_) ;
240+ return data_;
239241 }
240242
241- detail::ObjectData * data_;
243+ detail::VariantData * data_;
242244 detail::ResourceManager* resources_;
243245};
244246
0 commit comments