/* * malloc-free JSON parser for Arduino * Benoit Blanchon 2014 * MIT License */ #ifndef __ARDUINOJSONPARSER_H #define __ARDUINOJSONPARSER_H #include #include "utility/jsmn.h" class JsonObjectBase { public: JsonObjectBase() { json = NULL; tokens = NULL; } bool success() { return json != NULL && tokens != NULL; } protected: JsonObjectBase(char* json, jsmntok_t* tokens) { this->json = json; this->tokens = tokens; } int getNestedTokenCounts(int tokenIndex); char* json; jsmntok_t* tokens; }; class JsonArray; class JsonHashTable : public JsonObjectBase { friend class JsonParserBase; public: JsonHashTable() { } char* getString(char* key) { jsmntok_t* token = getToken(key); return token != NULL ? json + token->start : NULL; } JsonArray getArray(char* key); private: JsonHashTable(char* json, jsmntok_t* tokens) : JsonObjectBase(json, tokens) { } jsmntok_t* getToken(char* key); }; class JsonArray : public JsonObjectBase { friend class JsonParserBase; friend class JsonHashTable; public: public: JsonArray() { } JsonArray getArray(int index); char* getString(int index) { jsmntok_t* token = getToken(index); return token != NULL ? json + token->start : NULL; } int getLength() { return tokens != NULL ? tokens[0].size : 0; } private: JsonArray(char* json, jsmntok_t* tokens) : JsonObjectBase(json, tokens) { } jsmntok_t* getToken(int index); }; class JsonParserBase { public: JsonArray parseArray(char* json) { if (!parse(json) || tokens[0].type != JSMN_ARRAY) return JsonArray(); return JsonArray(json, tokens); } JsonHashTable parseHashTable(char* json) { if (!parse(json) || tokens[0].type != JSMN_OBJECT) return JsonHashTable(); return JsonHashTable(json, tokens); } protected: JsonParserBase(jsmntok_t* tokens, int maxTokenCount) { this->maxTokenCount = maxTokenCount; this->tokens = tokens; jsmn_init(&parser); } bool parse(char* json); private: char* buffer; jsmn_parser parser; int maxTokenCount; jsmntok_t* tokens; }; template class JsonParser : public JsonParserBase { public: JsonParser() : JsonParserBase(tokens, N) { } private: jsmntok_t tokens[N]; }; #endif