diff --git a/include/ArduinoJson/JsonValue.hpp b/include/ArduinoJson/JsonValue.hpp index 9645b92d..7ba05c0f 100644 --- a/include/ArduinoJson/JsonValue.hpp +++ b/include/ArduinoJson/JsonValue.hpp @@ -25,7 +25,7 @@ namespace ArduinoJson void operator=(int); void operator=(const JsonValue& value) { duplicate(value); } void operator=(const Internals::JsonNodeWrapper& object) { duplicate(object); } - + operator bool() const; operator const char*() const; operator double() const; @@ -35,5 +35,11 @@ namespace ArduinoJson operator JsonObject() const; void set(double value, int decimals); + + template + T as() + { + return static_cast(*this); + } }; } \ No newline at end of file diff --git a/test/JsonArray_Container_Tests.cpp b/test/JsonArray_Container_Tests.cpp index 323b2434..bd31a7e7 100644 --- a/test/JsonArray_Container_Tests.cpp +++ b/test/JsonArray_Container_Tests.cpp @@ -41,7 +41,7 @@ private: template void elementAtIndexMustBe(int index, T expected) { - EXPECT_EQ(expected, static_cast(array[index])); + EXPECT_EQ(expected, array[index].as()); } }; diff --git a/test/JsonArray_Iterator_Tests.cpp b/test/JsonArray_Iterator_Tests.cpp index 79e23cb3..9d6130be 100644 --- a/test/JsonArray_Iterator_Tests.cpp +++ b/test/JsonArray_Iterator_Tests.cpp @@ -16,10 +16,10 @@ TEST(JsonArray_Iterator_Test, SimpleTest) JsonArrayIterator end = array.end(); EXPECT_NE(end, it); - EXPECT_EQ(12, static_cast(*it)); + EXPECT_EQ(12, (*it).as()); // TODO: use -> ++it; EXPECT_NE(end, it); - EXPECT_EQ(34, static_cast(*it)); + EXPECT_EQ(34, (*it).as()); // TODO: use -> ++it; EXPECT_EQ(array.end(), it); } \ No newline at end of file diff --git a/test/JsonObject_Iterator_Tests.cpp b/test/JsonObject_Iterator_Tests.cpp index 7550cae2..86f191c2 100644 --- a/test/JsonObject_Iterator_Tests.cpp +++ b/test/JsonObject_Iterator_Tests.cpp @@ -17,11 +17,10 @@ TEST(JsonObject_Iterator_Test, SimpleTest) EXPECT_NE(end, it); EXPECT_STREQ("ab", it->key()); - EXPECT_EQ(12, static_cast(it->value())); - ++it; + EXPECT_EQ(12, it->value().as()); ++it; EXPECT_NE(end, it); EXPECT_STREQ("cd", it->key()); - EXPECT_EQ(34, static_cast(it->value())); + EXPECT_EQ(34, it->value().as()); ++it; EXPECT_EQ(object.end(), it); } \ No newline at end of file diff --git a/test/JsonParser_Array_Tests.cpp b/test/JsonParser_Array_Tests.cpp index b7e0da15..bd581281 100644 --- a/test/JsonParser_Array_Tests.cpp +++ b/test/JsonParser_Array_Tests.cpp @@ -44,12 +44,12 @@ protected: template void elementAtIndexMustBe(int index, T expected) { - EXPECT_EQ(expected, static_cast(_array[index])); + EXPECT_EQ(expected, _array[index].as()); } void elementAtIndexMustBe(int index, const char* expected) { - EXPECT_STREQ(expected, static_cast(_array[index])); + EXPECT_STREQ(expected, _array[index].as()); } StaticJsonBuffer<42> _jsonBuffer; diff --git a/test/JsonParser_Nested_Tests.cpp b/test/JsonParser_Nested_Tests.cpp new file mode 100644 index 00000000..80364513 --- /dev/null +++ b/test/JsonParser_Nested_Tests.cpp @@ -0,0 +1,51 @@ +#include +#include + +using namespace ArduinoJson; + +TEST(JsonParser_Nested_Tests, ArrayNestedInObject) +{ + StaticJsonBuffer<42> jsonBuffer; + char jsonString[] = " { \"ab\" : [ 1 , 2 ] , \"cd\" : [ 3 , 4 ] } "; + + JsonObject object = jsonBuffer.parseObject(jsonString); + JsonArray array1 = object["ab"]; + JsonArray array2 = object["cd"]; + + ASSERT_TRUE(object.success()); + + ASSERT_TRUE(array1.success()); + ASSERT_TRUE(array2.success()); + + ASSERT_EQ(2, array1.size()); + ASSERT_EQ(2, array2.size()); + + EXPECT_EQ(1, array1[0].as()); + EXPECT_EQ(2, array1[1].as()); + + EXPECT_EQ(3, array2[0].as()); + EXPECT_EQ(4, array2[1].as()); +} + +TEST(JsonParser_Nested_Tests, ObjectNestedInArray) +{ + StaticJsonBuffer<42> jsonBuffer; + char jsonString[] = " [ { \"a\" : 1 , \"b\" : 2 } , { \"c\" : 3 , \"d\" : 4 } ] "; + + JsonArray array = jsonBuffer.parseArray(jsonString); + JsonObject object1 = array[0]; + JsonObject object2 = array[1]; + + ASSERT_TRUE(array.success()); + + ASSERT_TRUE(object1.success()); + ASSERT_TRUE(object2.success()); + + ASSERT_EQ(2, object1.size()); + ASSERT_EQ(2, object2.size()); + + EXPECT_EQ(1, object1["a"].as()); + EXPECT_EQ(2, object1["b"].as()); + EXPECT_EQ(3, object2["c"].as()); + EXPECT_EQ(4, object2["d"].as()); +} \ No newline at end of file diff --git a/test/JsonParser_Object_Tests.cpp b/test/JsonParser_Object_Tests.cpp index 70f60fea..c91439ad 100644 --- a/test/JsonParser_Object_Tests.cpp +++ b/test/JsonParser_Object_Tests.cpp @@ -31,13 +31,13 @@ protected: void keyMustHaveValue(const char* key, const char* expected) { - EXPECT_STREQ(expected, static_cast(_object[key])); + EXPECT_STREQ(expected, _object[key].as()); } template void keyMustHaveValue(const char* key, T expected) { - EXPECT_EQ(expected, static_cast(_object[key])); + EXPECT_EQ(expected, _object[key].as()); } private: