mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-07-17 20:42:24 +02:00
Added class JsonHashTable
This commit is contained in:
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include "ArduinoJsonParser.h"
|
#include "ArduinoJsonParser.h"
|
||||||
|
|
||||||
int JsonParserBase::getNestedTokenCounts(int tokenIndex)
|
int JsonObjectBase::getNestedTokenCounts(int tokenIndex)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
@ -18,48 +18,46 @@ int JsonParserBase::getNestedTokenCounts(int tokenIndex)
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JsonParserBase::parseAndCheckType(char* jsonString, jsmntype_t type)
|
bool JsonParserBase::parse(char* jsonString)
|
||||||
{
|
{
|
||||||
buffer = jsonString;
|
buffer = jsonString;
|
||||||
|
|
||||||
if (JSMN_SUCCESS != jsmn_parse(&parser, jsonString, tokens, maxTokenCount))
|
if (JSMN_SUCCESS != jsmn_parse(&parser, jsonString, tokens, maxTokenCount))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (tokens[0].type != type)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Add null termination to each token
|
// Add null termination to each token
|
||||||
for (int i = 1; i < parser.toknext; i++)
|
for (int i = 1; i < parser.toknext; i++)
|
||||||
{
|
{
|
||||||
buffer[tokens[i].end] = 0;
|
buffer[tokens[i].end] = 0;
|
||||||
|
|
||||||
// skip nested objects
|
|
||||||
i += getNestedTokenCounts(i);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* JsonParserBase::getValueByKey(char* name)
|
char* JsonHashTable::getString(char* name)
|
||||||
{
|
{
|
||||||
// Scan each keys, every two other token
|
// skip first token, it's the whole object
|
||||||
// (skip index 0, because it's the whole json object)
|
int currentToken = 1;
|
||||||
for (int i = 1; i < parser.toknext; i += 2)
|
|
||||||
|
// Scan each keys
|
||||||
|
for (int i = 0; i < tokens[0].size / 2 ; i++)
|
||||||
{
|
{
|
||||||
// Get key token string
|
// Get key token string
|
||||||
char* key = buffer + tokens[i].start;
|
char* key = json + tokens[currentToken].start;
|
||||||
|
|
||||||
// Compare with desired name
|
// Compare with desired name
|
||||||
if (strcmp(name, key) == 0)
|
if (strcmp(name, key) == 0)
|
||||||
{
|
{
|
||||||
return buffer + tokens[i + 1].start;
|
return json + tokens[currentToken + 1].start;
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip nested objects
|
// move forward: key + value + nested tokens
|
||||||
i += getNestedTokenCounts(i);
|
currentToken += 2 + getNestedTokenCounts(currentToken + 1);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/*
|
||||||
char* JsonParserBase::getValueByIndex(int index)
|
char* JsonParserBase::getValueByIndex(int index)
|
||||||
{
|
{
|
||||||
for (int i = 1; i < parser.toknext; i++)
|
for (int i = 1; i < parser.toknext; i++)
|
||||||
@ -92,3 +90,4 @@ int JsonParserBase::getArraySize()
|
|||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
*/
|
@ -10,10 +10,69 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "utility/jsmn.h"
|
#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 JsonHashTable : public JsonObjectBase
|
||||||
|
{
|
||||||
|
friend class JsonParserBase;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
JsonHashTable()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
char* getString(char* key);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
JsonHashTable(char* json, jsmntok_t* tokens)
|
||||||
|
: JsonObjectBase(json, tokens)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class JsonParserBase
|
class JsonParserBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
JsonHashTable parseHashTable(char* json)
|
||||||
|
{
|
||||||
|
if (!parse(json) || tokens[0].type != JSMN_OBJECT)
|
||||||
|
return JsonHashTable();
|
||||||
|
|
||||||
|
return JsonHashTable(json, tokens);
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
JsonParserBase(jsmntok_t* tokens, int maxTokenCount)
|
JsonParserBase(jsmntok_t* tokens, int maxTokenCount)
|
||||||
@ -24,20 +83,14 @@ protected:
|
|||||||
jsmn_init(&parser);
|
jsmn_init(&parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
int getTokenCount()
|
bool parse(char* json);
|
||||||
{
|
/*
|
||||||
return parser.toknext - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool parseAndCheckType(char* json, jsmntype_t type);
|
|
||||||
char* getValueByIndex(int index);
|
char* getValueByIndex(int index);
|
||||||
char* getValueByKey(char* name);
|
char* getValueByKey(char* name);
|
||||||
int getArraySize();
|
int getArraySize();
|
||||||
|
*/
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int getNestedTokenCounts(int tokenIndex);
|
|
||||||
|
|
||||||
char* buffer;
|
char* buffer;
|
||||||
jsmn_parser parser;
|
jsmn_parser parser;
|
||||||
int maxTokenCount;
|
int maxTokenCount;
|
||||||
@ -45,31 +98,21 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <int N>
|
template <int N>
|
||||||
class JsonObjectParser : public JsonParserBase
|
class JsonParser : public JsonParserBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
JsonObjectParser()
|
JsonParser()
|
||||||
: JsonParserBase(tokens, N + 1)
|
: JsonParserBase(tokens, N)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool parse(char* json)
|
|
||||||
{
|
|
||||||
return parseAndCheckType(json, JSMN_OBJECT);
|
|
||||||
}
|
|
||||||
|
|
||||||
char* getValue(char* name)
|
|
||||||
{
|
|
||||||
return getValueByKey(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
jsmntok_t tokens[N + 1];
|
jsmntok_t tokens[N];
|
||||||
};
|
};
|
||||||
|
/*
|
||||||
template <int N>
|
template <int N>
|
||||||
class JsonArrayParser : public JsonParserBase
|
class JsonArrayParser : public JsonParserBase
|
||||||
{
|
{
|
||||||
@ -100,6 +143,6 @@ private:
|
|||||||
|
|
||||||
jsmntok_t tokens[N + 1];
|
jsmntok_t tokens[N + 1];
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user