Ver Fonte

Moved implementation in a .cpp file

Benoit Blanchon há 12 anos atrás
pai
commit
a80eca9e91
2 ficheiros alterados com 61 adições e 41 exclusões
  1. 44 0
      ArduinoJsonParser.cpp
  2. 17 41
      ArduinoJsonParser.h

+ 44 - 0
ArduinoJsonParser.cpp

@@ -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;
+		}
+	}
+}
+

+ 17 - 41
ArduinoJsonParser.h

@@ -12,55 +12,25 @@
 
 class JsonParserBase
 {
-public:
-
-	JsonParserBase()
-	{
-		jsmn_init(&parser);
-	}
-
 protected:
 
-	bool parseTokens(char* jsonString, jsmntok_t* tokens, int tokenCount)
+	JsonParserBase(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;
-	}
+		this->tokenCount = tokenCount;
+		this->tokens = tokens;
 
-	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;
-			}
-		}
+		jsmn_init(&parser);
 	}
+	
+	bool parseTokens(char* jsonString);
+	char* getValueByKey(char* name);
 
 private:
 
 	char* buffer;
 	jsmn_parser parser;
+	int tokenCount;
+	jsmntok_t* tokens;
 };
 
 template <int N>
@@ -68,14 +38,20 @@ class ArduinoJsonParser : JsonParserBase
 {
 public:
 
+	ArduinoJsonParser()
+		: JsonParserBase(tokens, N * 2 + 1)
+	{
+
+	}
+
 	bool parse(char* json)
 	{
-		return parseTokens(json, tokens, N * 2 + 1);
+		return parseTokens(json);
 	}
 	
 	char* getValue(char* name)
 	{
-		return getValueByKey(name, tokens, N * 2 + 1);
+		return getValueByKey(name);
 	}
 
 private: