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" | #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) | bool JsonParserBase::parseAndCheckType(char* jsonString, jsmntype_t type) | ||||||
| { | { | ||||||
| 	buffer = jsonString; | 	buffer = jsonString; | ||||||
| @@ -17,9 +29,12 @@ bool JsonParserBase::parseAndCheckType(char* jsonString, jsmntype_t type) | |||||||
| 		return false; | 		return false; | ||||||
|  |  | ||||||
| 	// Add null termination to each token | 	// 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; | 		buffer[tokens[i].end] = 0; | ||||||
|  |  | ||||||
|  | 		// skip nested objects | ||||||
|  | 		i += getNestedTokenCounts(i); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return true; | 	return true; | ||||||
| @@ -29,11 +44,8 @@ char* JsonParserBase::getValueByKey(char* name) | |||||||
| { | { | ||||||
| 	// Scan each keys, every two other token | 	// Scan each keys, every two other token | ||||||
| 	// (skip index 0, because it's the whole json object) | 	// (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 | 		// Get key token string | ||||||
| 		char* key = buffer + tokens[i].start; | 		char* key = buffer + tokens[i].start; | ||||||
|  |  | ||||||
| @@ -42,13 +54,41 @@ char* JsonParserBase::getValueByKey(char* name) | |||||||
| 		{ | 		{ | ||||||
| 			return buffer + tokens[i + 1].start; | 			return buffer + tokens[i + 1].start; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		// skip nested objects | ||||||
|  | 		i += getNestedTokenCounts(i); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| char* JsonParserBase::getValueByIndex(int index) | char* JsonParserBase::getValueByIndex(int index) | ||||||
| { | { | ||||||
| 	if (index < 0 || index >= parser.toknext) | 	for (int i = 1; i < parser.toknext; i++) | ||||||
| 		return NULL; | 	{ | ||||||
|  | 		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; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -32,9 +32,12 @@ protected: | |||||||
| 	bool parseAndCheckType(char* json, jsmntype_t type); | 	bool parseAndCheckType(char* json, jsmntype_t type); | ||||||
| 	char* getValueByIndex(int index); | 	char* getValueByIndex(int index); | ||||||
| 	char* getValueByKey(char* name); | 	char* getValueByKey(char* name); | ||||||
|  | 	int getArraySize(); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | 	int getNestedTokenCounts(int tokenIndex); | ||||||
|  |  | ||||||
| 	char* buffer; | 	char* buffer; | ||||||
| 	jsmn_parser parser; | 	jsmn_parser parser; | ||||||
| 	int maxTokenCount; | 	int maxTokenCount; | ||||||
| @@ -47,7 +50,7 @@ class JsonObjectParser : public JsonParserBase | |||||||
| public: | public: | ||||||
|  |  | ||||||
| 	JsonObjectParser() | 	JsonObjectParser() | ||||||
| 		: JsonParserBase(tokens, N * 2 + 1) | 		: JsonParserBase(tokens, N + 1) | ||||||
| 	{ | 	{ | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
| @@ -64,7 +67,7 @@ public: | |||||||
|  |  | ||||||
| private: | private: | ||||||
| 	 | 	 | ||||||
| 	jsmntok_t tokens[N * 2 + 1]; | 	jsmntok_t tokens[N + 1]; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template <int N> | template <int N> | ||||||
| @@ -85,7 +88,7 @@ public: | |||||||
|  |  | ||||||
| 	int getCount() | 	int getCount() | ||||||
| 	{ | 	{ | ||||||
| 		return getTokenCount(); | 		return getArraySize(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	char* getValue(int index) | 	char* getValue(int index) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user