mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +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