From a80eca9e919bfa684877fd3328c039268f7c66ca Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Fri, 10 Jan 2014 20:19:58 +0100 Subject: [PATCH] Moved implementation in a .cpp file --- ArduinoJsonParser.cpp | 44 ++++++++++++++++++++++++++++++++ ArduinoJsonParser.h | 58 +++++++++++++------------------------------ 2 files changed, 61 insertions(+), 41 deletions(-) create mode 100644 ArduinoJsonParser.cpp diff --git a/ArduinoJsonParser.cpp b/ArduinoJsonParser.cpp new file mode 100644 index 00000000..6973828e --- /dev/null +++ b/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; + } + } +} + diff --git a/ArduinoJsonParser.h b/ArduinoJsonParser.h index 5efc7292..ec33d0a5 100644 --- a/ArduinoJsonParser.h +++ b/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; + this->tokenCount = tokenCount; + this->tokens = tokens; - 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; - } - } + jsmn_init(&parser); } + + bool parseTokens(char* jsonString); + char* getValueByKey(char* name); private: char* buffer; jsmn_parser parser; + int tokenCount; + jsmntok_t* tokens; }; template @@ -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: