mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Moved implementation in a .cpp file
This commit is contained in:
		
							
								
								
									
										44
									
								
								ArduinoJsonParser.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								ArduinoJsonParser.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | |||||||
|  | /* | ||||||
|  |  * malloc-free JSON parser for Arduino | ||||||
|  |  * Benoit Blanchon 2014 | ||||||
|  |  * MIT License | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "ArduinoJsonParser.h" | ||||||
|  |  | ||||||
|  | bool JsonParserBase::parseTokens(char* jsonString) | ||||||
|  | { | ||||||
|  | 	buffer = jsonString; | ||||||
|  |  | ||||||
|  | 	if (JSMN_SUCCESS != jsmn_parse(&parser, jsonString, tokens, tokenCount)) | ||||||
|  | 		return false; | ||||||
|  |  | ||||||
|  | 	// Add null termination to each token | ||||||
|  | 	for (int i = 0; i < tokenCount; i++) | ||||||
|  | 	{ | ||||||
|  | 		buffer[tokens[i].end] = 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 < tokenCount; 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; | ||||||
|  |  | ||||||
|  | 		// Compare with desired name | ||||||
|  | 		if (strcmp(name, key) == 0) | ||||||
|  | 		{ | ||||||
|  | 			return buffer + tokens[i + 1].start; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| @@ -12,55 +12,25 @@ | |||||||
|  |  | ||||||
| class JsonParserBase | class JsonParserBase | ||||||
| { | { | ||||||
| public: | protected: | ||||||
|  |  | ||||||
| 	JsonParserBase() | 	JsonParserBase(jsmntok_t* tokens, int tokenCount) | ||||||
| 	{ | 	{ | ||||||
|  | 		this->tokenCount = tokenCount; | ||||||
|  | 		this->tokens = tokens; | ||||||
|  |  | ||||||
| 		jsmn_init(&parser); | 		jsmn_init(&parser); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| protected: | 	bool parseTokens(char* jsonString); | ||||||
|  | 	char* getValueByKey(char* name); | ||||||
| 	bool parseTokens(char* jsonString, jsmntok_t* tokens, int tokenCount) |  | ||||||
| 	{ |  | ||||||
| 		buffer = jsonString; |  | ||||||
|  |  | ||||||
| 		if (JSMN_SUCCESS != jsmn_parse(&parser, jsonString, tokens, tokenCount)) |  | ||||||
| 			return false; |  | ||||||
|  |  | ||||||
| 		// Add null termination to each token |  | ||||||
| 		for (int i = 0; i < tokenCount; i++) |  | ||||||
| 		{ |  | ||||||
| 			buffer[tokens[i].end] = 0; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	char* getValueByKey(char* name, jsmntok_t* tokens, int tokenCount) |  | ||||||
| 	{ |  | ||||||
| 		// Scan each keys, every two other token |  | ||||||
| 		// (skip index 0, because it's the whole json object) |  | ||||||
| 		for (int i = 1; i < tokenCount; 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; |  | ||||||
|  |  | ||||||
| 			// Compare with desired name |  | ||||||
| 			if (strcmp(name, key) == 0) |  | ||||||
| 			{ |  | ||||||
| 				return buffer + tokens[i + 1].start; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| private: | private: | ||||||
|  |  | ||||||
| 	char* buffer; | 	char* buffer; | ||||||
| 	jsmn_parser parser; | 	jsmn_parser parser; | ||||||
|  | 	int tokenCount; | ||||||
|  | 	jsmntok_t* tokens; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template <int N> | template <int N> | ||||||
| @@ -68,14 +38,20 @@ class ArduinoJsonParser : JsonParserBase | |||||||
| { | { | ||||||
| public: | public: | ||||||
|  |  | ||||||
|  | 	ArduinoJsonParser() | ||||||
|  | 		: JsonParserBase(tokens, N * 2 + 1) | ||||||
|  | 	{ | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	bool parse(char* json) | 	bool parse(char* json) | ||||||
| 	{ | 	{ | ||||||
| 		return parseTokens(json, tokens, N * 2 + 1); | 		return parseTokens(json); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	char* getValue(char* name) | 	char* getValue(char* name) | ||||||
| 	{ | 	{ | ||||||
| 		return getValueByKey(name, tokens, N * 2 + 1); | 		return getValueByKey(name); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| private: | private: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user