diff --git a/include/ArduinoJson/Internals/JsonNode.hpp b/include/ArduinoJson/Internals/JsonNode.hpp index 89d7bfd5..a7aef7a0 100644 --- a/include/ArduinoJson/Internals/JsonNode.hpp +++ b/include/ArduinoJson/Internals/JsonNode.hpp @@ -162,6 +162,11 @@ namespace ArduinoJson return type == JSON_ARRAY; } + bool isObject() + { + return type == JSON_OBJECT; + } + void addChild(JsonNode* childToAdd); void removeChild(JsonNode* childToRemove); diff --git a/include/ArduinoJson/Internals/JsonParser.hpp b/include/ArduinoJson/Internals/JsonParser.hpp index e101b66d..14872670 100644 --- a/include/ArduinoJson/Internals/JsonParser.hpp +++ b/include/ArduinoJson/Internals/JsonParser.hpp @@ -33,6 +33,8 @@ namespace ArduinoJson inline bool isEnd(); inline bool isLong(); inline bool isNull(); + inline bool isObjectStop(); + inline bool isObjectStart(); inline bool isSpace(); inline void skipOneChar(); @@ -42,6 +44,7 @@ namespace ArduinoJson inline JsonNode* parseBoolean(); inline JsonNode* parseLong(); inline JsonNode* parseNull(); + inline JsonNode* parseObject(); inline JsonNode* parseString(); JsonNode *parseDouble(); diff --git a/include/ArduinoJson/JsonBuffer.hpp b/include/ArduinoJson/JsonBuffer.hpp index 4ea05b56..c592145c 100644 --- a/include/ArduinoJson/JsonBuffer.hpp +++ b/include/ArduinoJson/JsonBuffer.hpp @@ -32,8 +32,8 @@ namespace ArduinoJson JsonValue createValue(); JsonArray parseArray(char* json); - - JsonValue parseValue(char* json); + JsonObject parseObject(char* json); + JsonValue parseValue(char* json); // TODO: remove protected: virtual void* allocateNode() = 0; diff --git a/include/ArduinoJson/JsonObject.hpp b/include/ArduinoJson/JsonObject.hpp index e360b435..a452f88f 100644 --- a/include/ArduinoJson/JsonObject.hpp +++ b/include/ArduinoJson/JsonObject.hpp @@ -23,6 +23,11 @@ namespace ArduinoJson JsonArray createNestedArray(const char* key); JsonObject createNestedObject(const char* key); + bool success() + { + return _node && _node->isObject(); + } + private: Internals::JsonNode* getOrCreateNodeAt(const char* key); }; diff --git a/src/Internals/JsonNode.cpp b/src/Internals/JsonNode.cpp index 7215a622..84451b1c 100644 --- a/src/Internals/JsonNode.cpp +++ b/src/Internals/JsonNode.cpp @@ -165,4 +165,5 @@ void JsonNode::duplicate(JsonNode* other) { *this = *other; } -} \ No newline at end of file +} + diff --git a/src/Internals/JsonParser.cpp b/src/Internals/JsonParser.cpp index 193c3343..f9f3d4f7 100644 --- a/src/Internals/JsonParser.cpp +++ b/src/Internals/JsonParser.cpp @@ -18,6 +18,16 @@ bool JsonParser::isArrayStop() return *_ptr == ']'; } +bool JsonParser::isObjectStart() +{ + return *_ptr == '{'; +} + +bool JsonParser::isObjectStop() +{ + return *_ptr == '}'; +} + bool JsonParser::isBoolean() { return *_ptr == 't' || *_ptr == 'f'; @@ -104,13 +114,15 @@ JsonNode* JsonParser::parseAnything() if (isNull()) return parseNull(); + if (isObjectStart()) + return parseObject(); + return parseString(); } JsonNode* JsonParser::parseArray() { - JsonNode* node = _buffer->createNode(); - node->setAsArray(_buffer); + JsonNode* node = _buffer->createArrayNode(); skipOneChar(); // skip the '[' skipSpaces(); @@ -137,6 +149,12 @@ JsonNode* JsonParser::parseArray() } } +JsonNode* JsonParser::parseObject() +{ + _ptr+=2; + return _buffer->createObjectNode(); +} + JsonNode *JsonParser::parseBoolean() { bool value = *_ptr == 't'; @@ -168,8 +186,7 @@ JsonNode* JsonParser::parseLong() JsonNode* JsonParser::parseNull() { - _ptr += 4; - // 4 = strlen("null") + _ptr += 4; // strlen("null") return _buffer->createStringNode(0); } diff --git a/src/JsonBuffer.cpp b/src/JsonBuffer.cpp index 97ce57ff..9ff742ac 100644 --- a/src/JsonBuffer.cpp +++ b/src/JsonBuffer.cpp @@ -28,6 +28,12 @@ JsonArray JsonBuffer::parseArray(char* json) return JsonArray(parser.parseAnything()); } +JsonObject JsonBuffer::parseObject(char* json) +{ + JsonParser parser(this, json); + return JsonObject(parser.parseAnything()); +} + JsonValue JsonBuffer::parseValue(char* json) { JsonParser parser(this, json); diff --git a/test/JsonParser_Object_Tests.cpp b/test/JsonParser_Object_Tests.cpp new file mode 100644 index 00000000..bb553d3a --- /dev/null +++ b/test/JsonParser_Object_Tests.cpp @@ -0,0 +1,20 @@ +#include +#include + +using namespace ArduinoJson; + +class JsonParser_Object_Test : public testing::Test +{ +protected: + + +}; + +TEST_F(JsonParser_Object_Test, EmptyObject) +{ + StaticJsonBuffer<10> jsonBuffer; + char jsonString[] = "{}"; + JsonObject object = jsonBuffer.parseObject(jsonString); + + EXPECT_TRUE(object.success()); +} \ No newline at end of file