diff --git a/JsonParser/JsonHashTable.cpp b/JsonParser/JsonHashTable.cpp index eff4a1a9..e3bc59e4 100644 --- a/JsonParser/JsonHashTable.cpp +++ b/JsonParser/JsonHashTable.cpp @@ -3,46 +3,12 @@ * Benoit Blanchon 2014 - MIT License */ -#include // for strcmp() #include "JsonHashTable.h" #include "JsonArray.h" #include "JsonValue.h" using namespace ArduinoJson::Parser; -/* -* Returns the token for the value associated with the specified key -*/ -JsonValue JsonHashTable::operator [](const char* desiredKey) -{ - // sanity check - if (!success() || desiredKey == 0) - return JsonValue(); - - // skip first token, it's the whole object - jsmntok_t* currentToken = tokens + 1; - - // scan each keys - for (int i = 0; i < tokens[0].size / 2 ; i++) - { - // get key token string - char* key = JsonValue(json, currentToken); - - // compare with desired name - if (strcmp(desiredKey, key) == 0) - { - // return the value token that follows the key token - return JsonValue(json, currentToken + 1); - } - - // move forward: key + value + nested tokens - currentToken += 2 + getNestedTokenCount(currentToken + 1); - } - - // nothing found, return NULL - return JsonValue(); -} - DEPRECATED JsonArray JsonHashTable::getArray(const char* key) { return (JsonArray) (*this)[key]; diff --git a/JsonParser/JsonHashTable.h b/JsonParser/JsonHashTable.h index e5351573..b6870610 100644 --- a/JsonParser/JsonHashTable.h +++ b/JsonParser/JsonHashTable.h @@ -14,9 +14,8 @@ namespace ArduinoJson { class JsonArray; - class JsonHashTable : public JsonObjectBase + class JsonHashTable { - friend class JsonParserBase; friend class JsonValue; public: @@ -25,50 +24,55 @@ namespace ArduinoJson bool success() { - return JsonObjectBase::success() && tokens->type == JSMN_OBJECT; + return value.success(); } - JsonValue operator[](const char* key); + JsonValue operator[](const char* key) + { + return value[key]; + } bool containsKey(const char* key) { - return (*this)[key].success(); + return value[key]; } DEPRECATED JsonArray getArray(const char* key); DEPRECATED bool getBool(const char* key) { - return (bool) (*this)[key]; + return value[key]; } DEPRECATED double getDouble(const char* key) { - return (double) (*this)[key]; + return value[key]; } DEPRECATED JsonHashTable getHashTable(const char* key) { - return (JsonHashTable) (*this)[key]; + return value[key]; } DEPRECATED long getLong(const char* key) { - return (long) (*this)[key]; + return value[key]; } DEPRECATED char* getString(const char* key) { - return (char*) (*this)[key]; + return value[key]; } private: - JsonHashTable(char* json, jsmntok_t* tokens) - : JsonObjectBase(json, tokens) + JsonHashTable(JsonValue& value) + : value(value) { } + + JsonValue value; }; } } \ No newline at end of file diff --git a/JsonParser/JsonObjectBase.h b/JsonParser/JsonObjectBase.h index d5362c87..2fe30777 100644 --- a/JsonParser/JsonObjectBase.h +++ b/JsonParser/JsonObjectBase.h @@ -21,6 +21,8 @@ namespace ArduinoJson { class JsonObjectBase { + friend class JsonHashTable; + public: JsonObjectBase() diff --git a/JsonParser/JsonValue.cpp b/JsonParser/JsonValue.cpp index 0b135acd..2de9e185 100644 --- a/JsonParser/JsonValue.cpp +++ b/JsonParser/JsonValue.cpp @@ -4,6 +4,7 @@ */ #include // for strtol, strtod +#include // for strcmp() #include "JsonArray.h" #include "JsonHashTable.h" #include "JsonValue.h" @@ -54,10 +55,47 @@ JsonValue::operator char*() JsonValue::operator JsonArray() { - return JsonArray(json, tokens); + return tokens->type != JSMN_ARRAY + ? JsonArray(*this) + : JsonArray(); } JsonValue::operator JsonHashTable() { - return JsonHashTable(json, tokens); + return tokens->type != JSMN_OBJECT + ? JsonHashTable(*this) + : JsonHashTable(); +} + +/* +* Returns the token for the value associated with the specified key +*/ +JsonValue JsonValue::operator [](const char* desiredKey) +{ + // sanity check + if (!json || !desiredKey || tokens->type != JSMN_OBJECT) + return JsonValue(); + + // skip first token, it's the whole object + jsmntok_t* currentToken = tokens + 1; + + // scan each keys + for (int i = 0; i < tokens[0].size / 2; i++) + { + // get key token string + char* key = JsonValue(json, currentToken); + + // compare with desired name + if (strcmp(desiredKey, key) == 0) + { + // return the value token that follows the key token + return JsonValue(json, currentToken + 1); + } + + // move forward: key + value + nested tokens + currentToken += 2 + getNestedTokenCount(currentToken + 1); + } + + // nothing found, return NULL + return JsonValue(); } \ No newline at end of file diff --git a/JsonParser/JsonValue.h b/JsonParser/JsonValue.h index 0dd5d700..d1579ac2 100644 --- a/JsonParser/JsonValue.h +++ b/JsonParser/JsonValue.h @@ -32,6 +32,8 @@ namespace ArduinoJson operator char*(); operator JsonArray(); operator JsonHashTable(); + + JsonValue operator[](const char* key); }; } } \ No newline at end of file