forked from bblanchon/ArduinoJson
Replaced composition by inheritance
This commit is contained in:
@ -7,7 +7,6 @@
|
||||
#include "JsonObject.h"
|
||||
|
||||
using namespace ArduinoJson::Parser;
|
||||
using namespace ArduinoJson::Internal;
|
||||
|
||||
DEPRECATED JsonObject JsonArray::getHashTable(int index)
|
||||
{
|
||||
@ -17,14 +16,14 @@ DEPRECATED JsonObject JsonArray::getHashTable(int index)
|
||||
/*
|
||||
* Returns the token for the value at the specified index
|
||||
*/
|
||||
JsonValue JsonArray::operator[](int index)
|
||||
JsonValue JsonArray::getValue(int index)
|
||||
{
|
||||
// sanity check
|
||||
if (index < 0 || !token.isArray() || index >= token.size())
|
||||
if (index < 0 || !isArray() || index >= size())
|
||||
return JsonValue::null();
|
||||
|
||||
// skip first token, it's the whole object
|
||||
JsonToken runningToken = token.firstChild();
|
||||
JsonToken runningToken = firstChild();
|
||||
|
||||
// skip all tokens before the specified index
|
||||
for (int i = 0; i < index; i++)
|
||||
@ -33,5 +32,5 @@ JsonValue JsonArray::operator[](int index)
|
||||
runningToken = runningToken.nextSibling();
|
||||
}
|
||||
|
||||
return JsonValue(json, runningToken);
|
||||
return runningToken;
|
||||
}
|
@ -15,42 +15,42 @@ namespace ArduinoJson
|
||||
{
|
||||
class JsonObject;
|
||||
|
||||
class JsonArray
|
||||
class JsonArray : public JsonToken
|
||||
{
|
||||
public:
|
||||
|
||||
JsonArray()
|
||||
: token(0)
|
||||
{
|
||||
|
||||
JsonArray()
|
||||
{
|
||||
}
|
||||
|
||||
JsonArray(char* json, Internal::JsonToken token)
|
||||
: json(json), token(token)
|
||||
JsonArray(JsonToken token)
|
||||
: JsonToken(token)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool success()
|
||||
{
|
||||
return token.isArray();
|
||||
return isArray();
|
||||
}
|
||||
|
||||
int size()
|
||||
{
|
||||
return success() ? token.size() : 0;
|
||||
return isArray() ? JsonToken::size() : 0;
|
||||
}
|
||||
|
||||
JsonValue operator[](int index);
|
||||
JsonValue operator[](int index)
|
||||
{
|
||||
return getValue(index);
|
||||
}
|
||||
|
||||
JsonArrayIterator begin()
|
||||
{
|
||||
return JsonArrayIterator(json, token.firstChild());
|
||||
return firstChild();
|
||||
}
|
||||
|
||||
JsonArrayIterator end()
|
||||
{
|
||||
return JsonArrayIterator(json, token.nextSibling());
|
||||
return nextSibling();
|
||||
}
|
||||
|
||||
DEPRECATED int getLength()
|
||||
@ -60,40 +60,34 @@ namespace ArduinoJson
|
||||
|
||||
DEPRECATED JsonArray getArray(int index)
|
||||
{
|
||||
return (JsonArray) (*this)[index];
|
||||
return getValue(index);
|
||||
}
|
||||
|
||||
DEPRECATED bool getBool(int index)
|
||||
{
|
||||
return (bool) (*this)[index];
|
||||
return getValue(index);
|
||||
}
|
||||
|
||||
DEPRECATED double getDouble(int index)
|
||||
{
|
||||
return (double) (*this)[index];
|
||||
return getValue(index);
|
||||
}
|
||||
|
||||
DEPRECATED JsonObject getHashTable(int index);
|
||||
|
||||
DEPRECATED long getLong(int index)
|
||||
{
|
||||
return (long) (*this)[index];
|
||||
return getValue(index);
|
||||
}
|
||||
|
||||
DEPRECATED char* getString(int index)
|
||||
{
|
||||
return (char*) (*this)[index];
|
||||
}
|
||||
|
||||
static JsonArray null()
|
||||
{
|
||||
return JsonArray();
|
||||
return getValue(index);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
char* json;
|
||||
Internal::JsonToken token;
|
||||
JsonValue getValue(int index);
|
||||
};
|
||||
}
|
||||
}
|
@ -12,35 +12,25 @@ namespace ArduinoJson
|
||||
{
|
||||
namespace Parser
|
||||
{
|
||||
class JsonArrayIterator
|
||||
class JsonArrayIterator : public JsonToken
|
||||
{
|
||||
public:
|
||||
|
||||
JsonArrayIterator(char* json, Internal::JsonToken token)
|
||||
: json(json), token(token)
|
||||
JsonArrayIterator(JsonToken token)
|
||||
: JsonToken(token)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void operator++()
|
||||
{
|
||||
token = token.nextSibling();
|
||||
*this = JsonArrayIterator(nextSibling());
|
||||
}
|
||||
|
||||
JsonValue operator*() const
|
||||
{
|
||||
return JsonValue(json, token);
|
||||
return JsonValue(*this);
|
||||
}
|
||||
|
||||
bool operator !=(const JsonArrayIterator& other)
|
||||
{
|
||||
return token != other.token;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
char* json;
|
||||
Internal::JsonToken token;
|
||||
};
|
||||
}
|
||||
}
|
@ -9,7 +9,6 @@
|
||||
#include "JsonValue.h"
|
||||
|
||||
using namespace ArduinoJson::Parser;
|
||||
using namespace ArduinoJson::Internal;
|
||||
|
||||
DEPRECATED JsonArray JsonObject::getArray(const char* key)
|
||||
{
|
||||
@ -22,17 +21,17 @@ DEPRECATED JsonArray JsonObject::getArray(const char* key)
|
||||
JsonValue JsonObject::getValue(const char* desiredKey)
|
||||
{
|
||||
// sanity check
|
||||
if (desiredKey == 0 || !token.isObject())
|
||||
if (desiredKey == 0 || !isObject())
|
||||
return JsonValue::null();
|
||||
|
||||
// skip first token, it's the whole object
|
||||
JsonToken runningToken = token.firstChild();
|
||||
JsonToken runningToken = firstChild();
|
||||
|
||||
// scan each keys
|
||||
for (int i = 0; i < token.size() / 2; i++)
|
||||
for (int i = 0; i < size() / 2; i++)
|
||||
{
|
||||
// get 'key' token string
|
||||
char* key = runningToken.getText(json);
|
||||
char* key = runningToken.getText();
|
||||
|
||||
// move to the 'value' token
|
||||
runningToken = runningToken.nextSibling();
|
||||
@ -41,7 +40,7 @@ JsonValue JsonObject::getValue(const char* desiredKey)
|
||||
if (strcmp(desiredKey, key) == 0)
|
||||
{
|
||||
// return the value token that follows the key token
|
||||
return JsonValue(json, runningToken);
|
||||
return runningToken;
|
||||
}
|
||||
|
||||
// skip nested tokens
|
||||
@ -49,5 +48,5 @@ JsonValue JsonObject::getValue(const char* desiredKey)
|
||||
}
|
||||
|
||||
// nothing found, return NULL
|
||||
return JsonValue::null();
|
||||
return null();
|
||||
}
|
@ -14,24 +14,23 @@ namespace ArduinoJson
|
||||
{
|
||||
class JsonArray;
|
||||
|
||||
class JsonObject
|
||||
class JsonObject : public JsonToken
|
||||
{
|
||||
public:
|
||||
|
||||
JsonObject(char* json, Internal::JsonToken token)
|
||||
: json(json), token(token)
|
||||
JsonObject()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
JsonObject()
|
||||
: token(Internal::JsonToken::null())
|
||||
JsonObject(JsonToken token)
|
||||
: JsonToken(token)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool success()
|
||||
{
|
||||
return token.isObject();
|
||||
return isObject();
|
||||
}
|
||||
|
||||
JsonValue operator[](const char* key)
|
||||
@ -46,12 +45,12 @@ namespace ArduinoJson
|
||||
|
||||
JsonObjectIterator begin()
|
||||
{
|
||||
return JsonObjectIterator(json, token.firstChild());
|
||||
return firstChild();
|
||||
}
|
||||
|
||||
JsonObjectIterator end()
|
||||
{
|
||||
return JsonObjectIterator(json, token.nextSibling());
|
||||
return nextSibling();
|
||||
}
|
||||
|
||||
DEPRECATED JsonArray getArray(const char* key);
|
||||
@ -83,14 +82,11 @@ namespace ArduinoJson
|
||||
|
||||
static JsonObject null()
|
||||
{
|
||||
return JsonObject();
|
||||
return JsonObject(JsonToken::null());
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
char* json;
|
||||
Internal::JsonToken token;
|
||||
|
||||
JsonValue getValue(const char* key);
|
||||
};
|
||||
|
||||
|
@ -13,35 +13,24 @@ namespace ArduinoJson
|
||||
{
|
||||
namespace Parser
|
||||
{
|
||||
class JsonObjectIterator
|
||||
class JsonObjectIterator : public JsonToken
|
||||
{
|
||||
public:
|
||||
|
||||
JsonObjectIterator(char* json, Internal::JsonToken token)
|
||||
: json(json), token(token)
|
||||
JsonObjectIterator(JsonToken token)
|
||||
: JsonToken(token)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void operator++()
|
||||
{
|
||||
token = token.nextSibling().nextSibling();
|
||||
*this = JsonObjectIterator(nextSibling().nextSibling());
|
||||
}
|
||||
|
||||
JsonPair operator*() const
|
||||
{
|
||||
return JsonPair(json, token);
|
||||
return JsonPair(*this);
|
||||
}
|
||||
|
||||
bool operator !=(const JsonObjectIterator& other)
|
||||
{
|
||||
return token != other.token;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
char* json;
|
||||
Internal::JsonToken token;
|
||||
};
|
||||
}
|
||||
}
|
@ -11,29 +11,24 @@ namespace ArduinoJson
|
||||
{
|
||||
namespace Parser
|
||||
{
|
||||
class JsonPair
|
||||
class JsonPair : public JsonToken
|
||||
{
|
||||
public:
|
||||
|
||||
JsonPair(char* json, Internal::JsonToken token)
|
||||
: json(json), token(token)
|
||||
JsonPair(JsonToken token)
|
||||
: JsonToken(token)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
const char* key()
|
||||
{
|
||||
return token.getText(json);
|
||||
return getText();
|
||||
}
|
||||
|
||||
JsonValue value()
|
||||
{
|
||||
return JsonValue(json, token.nextSibling());
|
||||
return JsonValue(nextSibling());
|
||||
}
|
||||
|
||||
private:
|
||||
char* json;
|
||||
Internal::JsonToken token;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,6 @@
|
||||
#include "JsonToken.h"
|
||||
|
||||
using namespace ArduinoJson::Parser;
|
||||
using namespace ArduinoJson::Internal;
|
||||
|
||||
JsonValue JsonParserBase::parse(char* json)
|
||||
{
|
||||
@ -17,5 +16,5 @@ JsonValue JsonParserBase::parse(char* json)
|
||||
if (JSMN_SUCCESS != jsmn_parse(&parser, json, tokens, maxTokens))
|
||||
return JsonValue::null();
|
||||
|
||||
return JsonValue(json, JsonToken(tokens));
|
||||
return JsonToken(json, tokens);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
#include "JsonToken.h"
|
||||
|
||||
using namespace ArduinoJson::Internal;
|
||||
using namespace ArduinoJson::Parser;
|
||||
|
||||
JsonToken JsonToken::nextSibling() const
|
||||
{
|
||||
@ -14,5 +14,5 @@ JsonToken JsonToken::nextSibling() const
|
||||
t++;
|
||||
}
|
||||
|
||||
return t;
|
||||
return JsonToken(json, t);
|
||||
}
|
@ -9,29 +9,37 @@
|
||||
|
||||
namespace ArduinoJson
|
||||
{
|
||||
namespace Internal
|
||||
namespace Parser
|
||||
{
|
||||
class JsonToken
|
||||
{
|
||||
public:
|
||||
|
||||
JsonToken(jsmntok_t* token)
|
||||
:token(token)
|
||||
JsonToken()
|
||||
: token(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
char* getText(char* json)
|
||||
JsonToken(char* json, jsmntok_t* token)
|
||||
: json(json), token(token)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
char* getText()
|
||||
{
|
||||
json[token->end] = 0;
|
||||
return json + token->start;
|
||||
}
|
||||
|
||||
// TODO: should be protected
|
||||
JsonToken firstChild() const
|
||||
{
|
||||
return token + 1;
|
||||
return JsonToken(json, token + 1);
|
||||
}
|
||||
|
||||
// TODO: should be protected
|
||||
JsonToken nextSibling() const;
|
||||
|
||||
bool operator!= (const JsonToken& other)
|
||||
@ -39,11 +47,13 @@ namespace ArduinoJson
|
||||
return token != other.token;
|
||||
}
|
||||
|
||||
int size()
|
||||
static JsonToken null()
|
||||
{
|
||||
return token->size;
|
||||
return JsonToken(0, 0);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
bool isValid()
|
||||
{
|
||||
return token != 0;
|
||||
@ -69,12 +79,13 @@ namespace ArduinoJson
|
||||
return token != 0 && token->type == JSMN_STRING;
|
||||
}
|
||||
|
||||
static JsonToken null()
|
||||
int size()
|
||||
{
|
||||
return 0;
|
||||
return token->size;
|
||||
}
|
||||
|
||||
private:
|
||||
char* json;
|
||||
jsmntok_t* token;
|
||||
};
|
||||
}
|
||||
|
@ -9,23 +9,22 @@
|
||||
#include "JsonValue.h"
|
||||
|
||||
using namespace ArduinoJson::Parser;
|
||||
using namespace ArduinoJson::Internal;
|
||||
|
||||
JsonValue JsonValue::operator[](int index)
|
||||
{
|
||||
return JsonArray(json, token)[index];
|
||||
return JsonArray(*this)[index];
|
||||
}
|
||||
|
||||
JsonValue JsonValue::operator[](const char* key)
|
||||
{
|
||||
return JsonObject(json, token)[key];
|
||||
return JsonObject(*this)[key];
|
||||
}
|
||||
|
||||
JsonValue::operator bool()
|
||||
{
|
||||
if (!token.isPrimitive()) return 0;
|
||||
if (!isPrimitive()) return 0;
|
||||
|
||||
char *text = token.getText(json);
|
||||
char *text = getText();
|
||||
|
||||
// "true"
|
||||
if (text[0] == 't') return true;
|
||||
@ -42,29 +41,25 @@ JsonValue::operator bool()
|
||||
|
||||
JsonValue::operator double()
|
||||
{
|
||||
return token.isPrimitive() ? strtod(token.getText(json), 0) : 0;
|
||||
return isPrimitive() ? strtod(getText(), 0) : 0;
|
||||
}
|
||||
|
||||
JsonValue::operator long()
|
||||
{
|
||||
return token.isPrimitive() ? strtol(token.getText(json), 0, 0) : 0;
|
||||
return isPrimitive() ? strtol(getText(), 0, 0) : 0;
|
||||
}
|
||||
|
||||
JsonValue::operator char*()
|
||||
{
|
||||
return token.isString() || token.isPrimitive() ? token.getText(json) : 0;
|
||||
return isString() || isPrimitive() ? getText() : 0;
|
||||
}
|
||||
|
||||
JsonValue::operator JsonArray()
|
||||
{
|
||||
return token.isArray()
|
||||
? JsonArray(json, token)
|
||||
: JsonArray::null();
|
||||
return *this;
|
||||
}
|
||||
|
||||
JsonValue::operator JsonObject()
|
||||
{
|
||||
return token.isObject()
|
||||
? JsonObject(json, token)
|
||||
: JsonObject::null();
|
||||
return *this;
|
||||
}
|
@ -24,19 +24,19 @@ namespace ArduinoJson
|
||||
class JsonArray;
|
||||
class JsonObject;
|
||||
|
||||
class JsonValue
|
||||
class JsonValue : public JsonToken
|
||||
{
|
||||
public:
|
||||
|
||||
JsonValue(char* json, Internal::JsonToken token)
|
||||
: json(json), token(token)
|
||||
{
|
||||
|
||||
JsonValue(JsonToken token)
|
||||
: JsonToken(token)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool success()
|
||||
{
|
||||
return token.isValid();
|
||||
return isValid();
|
||||
}
|
||||
|
||||
operator bool();
|
||||
@ -47,16 +47,6 @@ namespace ArduinoJson
|
||||
operator JsonObject();
|
||||
JsonValue operator[](int index);
|
||||
JsonValue operator[](const char*key);
|
||||
|
||||
static JsonValue null()
|
||||
{
|
||||
return JsonValue(0, Internal::JsonToken(0));
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
char* json;
|
||||
Internal::JsonToken token;
|
||||
};
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user