From 1475066edd8e9c2122fdcdc7b5b15bb1b790b94f Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Sat, 11 Jan 2014 16:53:20 +0100 Subject: [PATCH] Added a verification of the token type before converting to string --- JsonArray.cpp | 7 +++---- JsonHashTable.cpp | 12 ++++++------ JsonObjectBase.cpp | 14 +++++++++++--- JsonObjectBase.h | 5 +++-- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/JsonArray.cpp b/JsonArray.cpp index 4c84ba6b..6725f594 100644 --- a/JsonArray.cpp +++ b/JsonArray.cpp @@ -24,7 +24,7 @@ jsmntok_t* JsonArray::getToken(int index) return 0; // skip first token, it's the whole object - int currentToken = 1; + jsmntok_t* currentToken = tokens + 1; // skip all tokens before the specified index for (int i = 0; i < index; i++) @@ -33,7 +33,7 @@ jsmntok_t* JsonArray::getToken(int index) currentToken += 1 + getNestedTokenCount(currentToken); } - return &tokens[currentToken]; + return currentToken; } JsonArray JsonArray::getArray(int index) @@ -48,6 +48,5 @@ JsonHashTable JsonArray::getHashTable(int index) char* JsonArray::getString(int index) { - jsmntok_t* token = getToken(index); - return token != 0 ? json + token->start : 0; + return getTokenString(getToken(index)); } \ No newline at end of file diff --git a/JsonHashTable.cpp b/JsonHashTable.cpp index 6e778b6d..21ed0c22 100644 --- a/JsonHashTable.cpp +++ b/JsonHashTable.cpp @@ -25,18 +25,19 @@ jsmntok_t* JsonHashTable::getToken(char* desiredKey) return 0; // skip first token, it's the whole object - int currentToken = 1; + jsmntok_t* currentToken = tokens + 1; // scan each keys for (int i = 0; i < tokens[0].size / 2 ; i++) { // get key token string - char* key = json + tokens[currentToken].start; + char* key = getTokenString(currentToken); - // Compare with desired name + // compare with desired name if (strcmp(desiredKey, key) == 0) { - return &tokens[currentToken + 1]; + // return the value token that follows the key token + return currentToken + 1; } // move forward: key + value + nested tokens @@ -59,6 +60,5 @@ JsonHashTable JsonHashTable::getHashTable(char* key) char* JsonHashTable::getString(char* key) { - jsmntok_t* token = getToken(key); - return token != 0 ? json + token->start : 0; + return getTokenString(getToken(key)); } \ No newline at end of file diff --git a/JsonObjectBase.cpp b/JsonObjectBase.cpp index dd51c0af..231cf205 100644 --- a/JsonObjectBase.cpp +++ b/JsonObjectBase.cpp @@ -6,14 +6,22 @@ #include "JsonObjectBase.h" -int JsonObjectBase::getNestedTokenCount(int tokenIndex) +int JsonObjectBase::getNestedTokenCount(jsmntok_t* token) { int count = 0; - for (int i = 0; i < tokens[tokenIndex].size; i++) + for (int i = 0; i < token->size; i++) { - count += 1 + getNestedTokenCount(tokenIndex + 1 + i); + count += 1 + getNestedTokenCount(token + 1 + i); } return count; +} + +char* JsonObjectBase::getTokenString(jsmntok_t* token) +{ + if (token->type != JSMN_PRIMITIVE && token->type != JSMN_STRING) + return 0; + + return json + token->start; } \ No newline at end of file diff --git a/JsonObjectBase.h b/JsonObjectBase.h index 4cd6ba1d..3bd8d4be 100644 --- a/JsonObjectBase.h +++ b/JsonObjectBase.h @@ -36,8 +36,9 @@ protected: json = 0; tokens = 0; } - - int getNestedTokenCount(int tokenIndex); + + static int getNestedTokenCount(jsmntok_t* token); + char* getTokenString(jsmntok_t* token); char* json; jsmntok_t* tokens;