From e58f09db2aa0a2db1770c2e23e580a1934bfba04 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Fri, 10 Jan 2014 21:44:44 +0100 Subject: [PATCH] Fixed nested elements --- ArduinoJsonParser.cpp | 56 ++++++++++++++++++++++++++++++++++++------- ArduinoJsonParser.h | 9 ++++--- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/ArduinoJsonParser.cpp b/ArduinoJsonParser.cpp index 14f7345e..6cdc58a5 100644 --- a/ArduinoJsonParser.cpp +++ b/ArduinoJsonParser.cpp @@ -6,6 +6,18 @@ #include "ArduinoJsonParser.h" +int JsonParserBase::getNestedTokenCounts(int tokenIndex) +{ + int count = 0; + + for (int i = 0; i < tokens[tokenIndex].size; i++) + { + count += 1 + getNestedTokenCounts(tokenIndex + 1 + i); + } + + return count; +} + bool JsonParserBase::parseAndCheckType(char* jsonString, jsmntype_t type) { buffer = jsonString; @@ -17,9 +29,12 @@ bool JsonParserBase::parseAndCheckType(char* jsonString, jsmntype_t type) return false; // Add null termination to each token - for (int i = 0; i < maxTokenCount; i++) + for (int i = 1; i < parser.toknext; i++) { buffer[tokens[i].end] = 0; + + // skip nested objects + i += getNestedTokenCounts(i); } return true; @@ -29,11 +44,8 @@ char* JsonParserBase::getValueByKey(char* name) { // Scan each keys, every two other token // (skip index 0, because it's the whole json object) - for (int i = 1; i < maxTokenCount; i += 2) + for (int i = 1; i < parser.toknext; i += 2) { - // Early break if we reach the last token - if (i >= parser.toknext) break; - // Get key token string char* key = buffer + tokens[i].start; @@ -42,13 +54,41 @@ char* JsonParserBase::getValueByKey(char* name) { return buffer + tokens[i + 1].start; } + + // skip nested objects + i += getNestedTokenCounts(i); } } char* JsonParserBase::getValueByIndex(int index) { - if (index < 0 || index >= parser.toknext) - return NULL; + for (int i = 1; i < parser.toknext; i++) + { + if (index == 0) + { + return buffer + tokens[i].start; + } - return buffer + tokens[index + 1].start; + // skip nested objects + i += getNestedTokenCounts(i); + + index--; + } + + return NULL; +} + +int JsonParserBase::getArraySize() +{ + int size = 0; + + for (int i = 1; i < parser.toknext; i++) + { + // skip nested objects + i += getNestedTokenCounts(i); + + size++; + } + + return size; } diff --git a/ArduinoJsonParser.h b/ArduinoJsonParser.h index 438225be..6973ea8b 100644 --- a/ArduinoJsonParser.h +++ b/ArduinoJsonParser.h @@ -32,9 +32,12 @@ protected: bool parseAndCheckType(char* json, jsmntype_t type); char* getValueByIndex(int index); char* getValueByKey(char* name); + int getArraySize(); private: + int getNestedTokenCounts(int tokenIndex); + char* buffer; jsmn_parser parser; int maxTokenCount; @@ -47,7 +50,7 @@ class JsonObjectParser : public JsonParserBase public: JsonObjectParser() - : JsonParserBase(tokens, N * 2 + 1) + : JsonParserBase(tokens, N + 1) { } @@ -64,7 +67,7 @@ public: private: - jsmntok_t tokens[N * 2 + 1]; + jsmntok_t tokens[N + 1]; }; template @@ -85,7 +88,7 @@ public: int getCount() { - return getTokenCount(); + return getArraySize(); } char* getValue(int index)