diff --git a/JsonParser/JsonArray.cpp b/JsonParser/JsonArray.cpp index 465f1c3f..07067c46 100644 --- a/JsonParser/JsonArray.cpp +++ b/JsonParser/JsonArray.cpp @@ -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; } \ No newline at end of file diff --git a/JsonParser/JsonArray.h b/JsonParser/JsonArray.h index dd2f1f35..a6553465 100644 --- a/JsonParser/JsonArray.h +++ b/JsonParser/JsonArray.h @@ -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); }; } } \ No newline at end of file diff --git a/JsonParser/JsonArrayIterator.h b/JsonParser/JsonArrayIterator.h index 2aa76564..ca1724e6 100644 --- a/JsonParser/JsonArrayIterator.h +++ b/JsonParser/JsonArrayIterator.h @@ -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; }; } } \ No newline at end of file diff --git a/JsonParser/JsonObject.cpp b/JsonParser/JsonObject.cpp index 9368edf0..d5f8330a 100644 --- a/JsonParser/JsonObject.cpp +++ b/JsonParser/JsonObject.cpp @@ -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(); } \ No newline at end of file diff --git a/JsonParser/JsonObject.h b/JsonParser/JsonObject.h index e02f7adf..07d447fd 100644 --- a/JsonParser/JsonObject.h +++ b/JsonParser/JsonObject.h @@ -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); }; diff --git a/JsonParser/JsonObjectIterator.h b/JsonParser/JsonObjectIterator.h index e5e5fa54..bf51103d 100644 --- a/JsonParser/JsonObjectIterator.h +++ b/JsonParser/JsonObjectIterator.h @@ -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; }; } } \ No newline at end of file diff --git a/JsonParser/JsonPair.h b/JsonParser/JsonPair.h index f0093464..e0791d98 100644 --- a/JsonParser/JsonPair.h +++ b/JsonParser/JsonPair.h @@ -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; }; } } diff --git a/JsonParser/JsonParserBase.cpp b/JsonParser/JsonParserBase.cpp index 2d0767ab..07d4393e 100644 --- a/JsonParser/JsonParserBase.cpp +++ b/JsonParser/JsonParserBase.cpp @@ -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); } diff --git a/JsonParser/JsonToken.cpp b/JsonParser/JsonToken.cpp index 52dac83b..1c22f809 100644 --- a/JsonParser/JsonToken.cpp +++ b/JsonParser/JsonToken.cpp @@ -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); } \ No newline at end of file diff --git a/JsonParser/JsonToken.h b/JsonParser/JsonToken.h index 418d0689..43bcad4e 100644 --- a/JsonParser/JsonToken.h +++ b/JsonParser/JsonToken.h @@ -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; }; } diff --git a/JsonParser/JsonValue.cpp b/JsonParser/JsonValue.cpp index 7cc2d7b7..0b3526d4 100644 --- a/JsonParser/JsonValue.cpp +++ b/JsonParser/JsonValue.cpp @@ -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; } \ No newline at end of file diff --git a/JsonParser/JsonValue.h b/JsonParser/JsonValue.h index 4c5f973b..ac9eef55 100644 --- a/JsonParser/JsonValue.h +++ b/JsonParser/JsonValue.h @@ -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; }; } } \ No newline at end of file