Explorar o código

Fixed nested elements

Benoit Blanchon %!s(int64=12) %!d(string=hai) anos
pai
achega
e58f09db2a
Modificáronse 2 ficheiros con 54 adicións e 11 borrados
  1. 48 8
      ArduinoJsonParser.cpp
  2. 6 3
      ArduinoJsonParser.h

+ 48 - 8
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;
+		}
+
+		// 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 buffer + tokens[index + 1].start;
+	return size;
 }

+ 6 - 3
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 <int N>
@@ -85,7 +88,7 @@ public:
 
 	int getCount()
 	{
-		return getTokenCount();
+		return getArraySize();
 	}
 
 	char* getValue(int index)