mirror of
https://github.com/eledio-devices/thirdparty-ArduinoJson.git
synced 2025-11-01 08:48:30 +01:00
Fix is<object>() and getMember()
This commit is contained in:
@@ -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<T>()") {
|
||||
CHECK(doc1.is<JsonArrayConst>() == false);
|
||||
CHECK(doc1.is<JsonObjectConst>() == true);
|
||||
CHECK(doc1.is<JsonObject>() == false);
|
||||
CHECK(variant.is<JsonArrayConst>() == false);
|
||||
CHECK(variant.is<JsonObjectConst>() == true);
|
||||
CHECK(variant.is<JsonObject>() == false);
|
||||
}
|
||||
|
||||
SECTION("get member") {
|
||||
CHECK(doc1["hello"].as<std::string>() == "world");
|
||||
CHECK(variant["hello"].as<std::string>() == "world");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,7 +276,7 @@ struct Converter<ObjectRef> {
|
||||
|
||||
static bool checkJson(VariantRef src) {
|
||||
VariantData* data = getData(src);
|
||||
return data && data->isObject();
|
||||
return data && data->isObjectStrict();
|
||||
}
|
||||
};
|
||||
} // namespace ARDUINOJSON_NAMESPACE
|
||||
|
||||
@@ -100,6 +100,8 @@ class VariantData {
|
||||
}
|
||||
|
||||
const CollectionData *asObject() const {
|
||||
if (isPointer())
|
||||
return _content.asPointer->asObject();
|
||||
return const_cast<VariantData *>(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 <typename TAdaptedString>
|
||||
VariantData *getMember(TAdaptedString key) const {
|
||||
return isObject() ? _content.asCollection.getMember(key) : 0;
|
||||
const CollectionData *col = asObject();
|
||||
return col ? col->getMember(key) : 0;
|
||||
}
|
||||
|
||||
template <typename TAdaptedString, typename TStoragePolicy>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user