Skip to content

Commit fe6de3a

Browse files
committed
JsonObjectConst: replace ObjectData* member with VariantData*
1 parent e27439f commit fe6de3a

File tree

5 files changed

+22
-18
lines changed

5 files changed

+22
-18
lines changed

src/ArduinoJson/Object/JsonObject.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
3333
}
3434

3535
operator JsonObjectConst() const {
36-
return JsonObjectConst(data_, resources_);
36+
return JsonObjectConst(collectionToVariant(data_), resources_);
3737
}
3838

3939
operator JsonVariantConst() const {

src/ArduinoJson/Object/JsonObjectConst.hpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
2222
JsonObjectConst() : data_(0), resources_(0) {}
2323

2424
// INTERNAL USE ONLY
25-
JsonObjectConst(const detail::ObjectData* data,
25+
JsonObjectConst(const detail::VariantData* data,
2626
const detail::ResourceManager* resources)
2727
: data_(data), resources_(resources) {}
2828

@@ -33,13 +33,13 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
3333
// Returns true if the reference is unbound.
3434
// https://arduinojson.org/v7/api/jsonobjectconst/isnull/
3535
bool isNull() const {
36-
return data_ == 0;
36+
return !data_ || !data_->isObject();
3737
}
3838

3939
// Returns true if the reference is bound.
4040
// https://arduinojson.org/v7/api/jsonobjectconst/isnull/
4141
operator bool() const {
42-
return data_ != 0;
42+
return !isNull();
4343
}
4444

4545
// Returns the depth (nesting level) of the object.
@@ -57,9 +57,10 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
5757
// Returns an iterator to the first key-value pair of the object.
5858
// https://arduinojson.org/v7/api/jsonobjectconst/begin/
5959
iterator begin() const {
60-
if (!data_)
60+
auto obj = detail::VariantData::asObject(data_);
61+
if (!obj)
6162
return iterator();
62-
return iterator(data_->createIterator(resources_), resources_);
63+
return iterator(obj->createIterator(resources_), resources_);
6364
}
6465

6566
// Returns an iterator following the last key-value pair of the object.
@@ -74,17 +75,17 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
7475
detail::enable_if_t<detail::IsString<TString>::value, int> = 0>
7576
ARDUINOJSON_DEPRECATED("use obj[key].is<T>() instead")
7677
bool containsKey(const TString& key) const {
77-
return detail::ObjectData::getMember(data_, detail::adaptString(key),
78-
resources_) != 0;
78+
return detail::VariantData::getMember(data_, detail::adaptString(key),
79+
resources_) != 0;
7980
}
8081

8182
// DEPRECATED: use obj["key"].is<T>() instead
8283
// https://arduinojson.org/v7/api/jsonobjectconst/containskey/
8384
template <typename TChar>
8485
ARDUINOJSON_DEPRECATED("use obj[\"key\"].is<T>() instead")
8586
bool containsKey(TChar* key) const {
86-
return detail::ObjectData::getMember(data_, detail::adaptString(key),
87-
resources_) != 0;
87+
return detail::VariantData::getMember(data_, detail::adaptString(key),
88+
resources_) != 0;
8889
}
8990

9091
// DEPRECATED: use obj[key].is<T>() instead
@@ -101,7 +102,7 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
101102
template <typename TString,
102103
detail::enable_if_t<detail::IsString<TString>::value, int> = 0>
103104
JsonVariantConst operator[](const TString& key) const {
104-
return JsonVariantConst(detail::ObjectData::getMember(
105+
return JsonVariantConst(detail::VariantData::getMember(
105106
data_, detail::adaptString(key), resources_),
106107
resources_);
107108
}
@@ -113,7 +114,7 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
113114
!detail::is_const<TChar>::value,
114115
int> = 0>
115116
JsonVariantConst operator[](TChar* key) const {
116-
return JsonVariantConst(detail::ObjectData::getMember(
117+
return JsonVariantConst(detail::VariantData::getMember(
117118
data_, detail::adaptString(key), resources_),
118119
resources_);
119120
}
@@ -137,10 +138,10 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
137138

138139
private:
139140
const detail::VariantData* getData() const {
140-
return collectionToVariant(data_);
141+
return data_;
141142
}
142143

143-
const detail::ObjectData* data_;
144+
const detail::VariantData* data_;
144145
const detail::ResourceManager* resources_;
145146
};
146147

src/ArduinoJson/Variant/ConverterImpl.hpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,9 +369,7 @@ struct Converter<JsonObjectConst> : private detail::VariantAttorney {
369369
}
370370

371371
static JsonObjectConst fromJson(JsonVariantConst src) {
372-
auto data = getData(src);
373-
auto object = data != 0 ? data->asObject() : nullptr;
374-
return JsonObjectConst(object, getResourceManager(src));
372+
return JsonObjectConst(getData(src), getResourceManager(src));
375373
}
376374

377375
static bool checkJson(JsonVariantConst src) {

src/ArduinoJson/Variant/JsonVariantVisitor.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ class VisitorAdapter {
3535
}
3636

3737
result_type visit(const ObjectData& value) {
38-
return visitor_->visit(JsonObjectConst(&value, resources_));
38+
return visitor_->visit(
39+
JsonObjectConst(collectionToVariant(&value), resources_));
3940
}
4041

4142
template <typename T>

src/ArduinoJson/Variant/VariantData.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,10 @@ class VariantData {
292292
return const_cast<VariantData*>(this)->asObject();
293293
}
294294

295+
static const ObjectData* asObject(const VariantData* var) {
296+
return var ? var->asObject() : 0;
297+
}
298+
295299
JsonString asRawString() const {
296300
switch (type_) {
297301
case VariantType::RawString:

0 commit comments

Comments
 (0)