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