2014-01-10 16:55:12 +01:00
|
|
|
/*
|
|
|
|
* malloc-free JSON parser for Arduino
|
|
|
|
* Benoit Blanchon 2014
|
|
|
|
* MIT License
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __ARDUINOJSONPARSER_H
|
|
|
|
#define __ARDUINOJSONPARSER_H
|
|
|
|
|
|
|
|
#include <Arduino.h>
|
|
|
|
#include "utility/jsmn.h"
|
|
|
|
|
2014-01-11 10:45:14 +01:00
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
2014-01-11 11:06:33 +01:00
|
|
|
class JsonArray;
|
|
|
|
|
2014-01-11 10:45:14 +01:00
|
|
|
class JsonHashTable : public JsonObjectBase
|
|
|
|
{
|
|
|
|
friend class JsonParserBase;
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
JsonHashTable()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2014-01-11 11:06:33 +01:00
|
|
|
char* getString(char* key)
|
|
|
|
{
|
|
|
|
jsmntok_t* token = getToken(key);
|
|
|
|
return token != NULL ? json + token->start : NULL;
|
|
|
|
}
|
|
|
|
|
2014-01-11 10:57:55 +01:00
|
|
|
JsonArray getArray(char* key);
|
2014-01-11 10:45:14 +01:00
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
JsonHashTable(char* json, jsmntok_t* tokens)
|
|
|
|
: JsonObjectBase(json, tokens)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
2014-01-11 11:06:33 +01:00
|
|
|
|
|
|
|
jsmntok_t* getToken(char* key);
|
2014-01-11 10:45:14 +01:00
|
|
|
};
|
|
|
|
|
2014-01-11 10:57:55 +01:00
|
|
|
class JsonArray : public JsonObjectBase
|
|
|
|
{
|
|
|
|
friend class JsonParserBase;
|
2014-01-11 11:06:33 +01:00
|
|
|
friend class JsonHashTable;
|
2014-01-11 10:57:55 +01:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
JsonArray()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2014-01-11 11:18:53 +01:00
|
|
|
JsonArray getArray(int index);
|
|
|
|
|
|
|
|
char* getString(int index)
|
|
|
|
{
|
|
|
|
jsmntok_t* token = getToken(index);
|
|
|
|
return token != NULL ? json + token->start : NULL;
|
|
|
|
}
|
2014-01-11 10:57:55 +01:00
|
|
|
|
|
|
|
int getLength()
|
|
|
|
{
|
|
|
|
return tokens != NULL ? tokens[0].size : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
JsonArray(char* json, jsmntok_t* tokens)
|
|
|
|
: JsonObjectBase(json, tokens)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
2014-01-11 11:18:53 +01:00
|
|
|
|
|
|
|
jsmntok_t* getToken(int index);
|
2014-01-11 10:57:55 +01:00
|
|
|
};
|
|
|
|
|
2014-01-10 20:13:18 +01:00
|
|
|
class JsonParserBase
|
2014-01-10 16:55:12 +01:00
|
|
|
{
|
2014-01-10 20:50:29 +01:00
|
|
|
public:
|
|
|
|
|
2014-01-11 10:57:55 +01:00
|
|
|
JsonArray parseArray(char* json)
|
|
|
|
{
|
|
|
|
if (!parse(json) || tokens[0].type != JSMN_ARRAY)
|
|
|
|
return JsonArray();
|
|
|
|
|
|
|
|
return JsonArray(json, tokens);
|
|
|
|
}
|
|
|
|
|
2014-01-11 10:45:14 +01:00
|
|
|
JsonHashTable parseHashTable(char* json)
|
|
|
|
{
|
|
|
|
if (!parse(json) || tokens[0].type != JSMN_OBJECT)
|
|
|
|
return JsonHashTable();
|
|
|
|
|
|
|
|
return JsonHashTable(json, tokens);
|
|
|
|
}
|
2014-01-11 10:57:55 +01:00
|
|
|
|
2014-01-10 20:13:18 +01:00
|
|
|
protected:
|
|
|
|
|
2014-01-10 20:50:29 +01:00
|
|
|
JsonParserBase(jsmntok_t* tokens, int maxTokenCount)
|
2014-01-10 16:55:12 +01:00
|
|
|
{
|
2014-01-10 20:50:29 +01:00
|
|
|
this->maxTokenCount = maxTokenCount;
|
2014-01-10 20:19:58 +01:00
|
|
|
this->tokens = tokens;
|
2014-01-10 16:55:12 +01:00
|
|
|
|
2014-01-10 20:19:58 +01:00
|
|
|
jsmn_init(&parser);
|
2014-01-10 20:50:29 +01:00
|
|
|
}
|
2014-01-10 20:19:58 +01:00
|
|
|
|
2014-01-11 10:45:14 +01:00
|
|
|
bool parse(char* json);
|
2014-01-11 11:18:53 +01:00
|
|
|
|
2014-01-10 16:55:12 +01:00
|
|
|
private:
|
|
|
|
|
|
|
|
char* buffer;
|
|
|
|
jsmn_parser parser;
|
2014-01-10 20:50:29 +01:00
|
|
|
int maxTokenCount;
|
2014-01-10 20:19:58 +01:00
|
|
|
jsmntok_t* tokens;
|
2014-01-10 20:13:18 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
template <int N>
|
2014-01-11 10:45:14 +01:00
|
|
|
class JsonParser : public JsonParserBase
|
2014-01-10 20:13:18 +01:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2014-01-11 10:45:14 +01:00
|
|
|
JsonParser()
|
|
|
|
: JsonParserBase(tokens, N)
|
2014-01-10 20:13:18 +01:00
|
|
|
{
|
2014-01-10 20:50:29 +01:00
|
|
|
|
2014-01-10 20:13:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
2014-01-11 10:45:14 +01:00
|
|
|
jsmntok_t tokens[N];
|
2014-01-10 16:55:12 +01:00
|
|
|
};
|
2014-01-10 20:50:29 +01:00
|
|
|
|
2014-01-10 16:55:12 +01:00
|
|
|
#endif
|
|
|
|
|