mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Fixed nested elements
This commit is contained in:
		| @@ -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; | ||||
|  | ||||
| 	return buffer + tokens[index + 1].start; | ||||
| 	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 size; | ||||
| } | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user