Просмотр исходного кода

Added class JsonValue.
Added subscript operator on JsonArray and JsonHashTable

Benoît Blanchon 11 лет назад
Родитель
Сommit
d189bd7140

+ 5 - 29
JsonParser/JsonArray.cpp

@@ -19,11 +19,11 @@ JsonArray::JsonArray(char* json, jsmntok_t* tokens)
 /*
 * Returns the token for the value at the specified index
 */
-jsmntok_t* JsonArray::getToken(int index)
+JsonValue JsonArray::operator[](int index)
 {
 	// sanity check
 	if (json == 0 || tokens == 0 || index < 0 || index >= tokens[0].size)
-		return 0;
+        return JsonValue();
 
 	// skip first token, it's the whole object
 	jsmntok_t* currentToken = tokens + 1;
@@ -35,35 +35,11 @@ jsmntok_t* JsonArray::getToken(int index)
 		currentToken += 1 + getNestedTokenCount(currentToken);
 	}
 
-	return currentToken;
+	return JsonValue(json, currentToken);
 }
 
-JsonArray JsonArray::getArray(int index)
-{
-	return JsonArray(json, getToken(index));
-}
 
-bool JsonArray::getBool(int index)
+JsonHashTable JsonArray::getHashTable(int index) DEPRECATED
 {
-	return getBoolFromToken(getToken(index));
+    return (JsonHashTable) (*this)[index];
 }
-
-double JsonArray::getDouble(int index)
-{
-	return getDoubleFromToken(getToken(index));
-}
-
-JsonHashTable JsonArray::getHashTable(int index)
-{
-	return JsonHashTable(json, getToken(index));
-}
-
-long JsonArray::getLong(int index)
-{
-	return getLongFromToken(getToken(index));
-}
-
-char* JsonArray::getString(int index)
-{
-	return getStringFromToken(getToken(index));
-}

+ 32 - 8
JsonParser/JsonArray.h

@@ -6,6 +6,9 @@
 #pragma once
 
 #include "JsonObjectBase.h"
+#include "JsonValue.h"
+
+#define DEPRECATED
 
 namespace ArduinoJson
 {
@@ -16,7 +19,7 @@ namespace ArduinoJson
         class JsonArray : public JsonObjectBase
         {
             friend class JsonParserBase;
-            friend class JsonHashTable;
+            friend class JsonValue;
 
         public:
 
@@ -27,17 +30,38 @@ namespace ArduinoJson
                 return tokens != 0 ? tokens[0].size : 0;
             }
 
-            JsonArray getArray(int index);
-            bool getBool(int index);
-            double getDouble(int index);
-            JsonHashTable getHashTable(int index);
-            long getLong(int index);
-            char* getString(int index);
+            JsonValue operator[](int index);
+                      
+            JsonArray getArray(int index) DEPRECATED
+            {
+                return (JsonArray) (*this)[index];
+            }
+
+            bool getBool(int index) DEPRECATED
+            {
+                return (bool) (*this)[index];
+            }
+
+            double getDouble(int index) DEPRECATED
+            {
+                return (double) (*this)[index];
+            }
+
+            JsonHashTable getHashTable(int index) DEPRECATED;
+
+            long getLong(int index) DEPRECATED
+            {
+                return (long) (*this)[index];
+            }
+
+            char* getString(int index) DEPRECATED
+            {
+                return (char*) (*this)[index];
+            }
 
         private:
 
             JsonArray(char* json, jsmntok_t* tokens);
-            jsmntok_t* getToken(int index);
         };
     }
 }

+ 9 - 38
JsonParser/JsonHashTable.cpp

@@ -4,8 +4,9 @@
 */
 
 #include <string.h> // for strcmp()
-#include "JsonArray.h"
 #include "JsonHashTable.h"
+#include "JsonArray.h"
+#include "JsonValue.h"
 
 using namespace ArduinoJson::Parser;
 
@@ -19,11 +20,11 @@ JsonHashTable::JsonHashTable(char* json, jsmntok_t* tokens)
 /*
 * Returns the token for the value associated with the specified key
 */
-jsmntok_t* JsonHashTable::getToken(const char* desiredKey)
+JsonValue JsonHashTable::operator [](const char* desiredKey)
 {	
 	// sanity check
 	if (json == 0 || tokens == 0 || desiredKey == 0)
-		return 0;
+        return JsonValue();
 
 	// skip first token, it's the whole object
 	jsmntok_t* currentToken = tokens + 1;
@@ -32,13 +33,13 @@ jsmntok_t* JsonHashTable::getToken(const char* desiredKey)
 	for (int i = 0; i < tokens[0].size / 2 ; i++)
 	{
 		// get key token string
-		char* key = getStringFromToken(currentToken);
+		char* key = JsonValue(json, currentToken);
 
 		// compare with desired name
 		if (strcmp(desiredKey, key) == 0)
 		{
 			// return the value token that follows the key token
-			return currentToken + 1;
+			return JsonValue(json, currentToken + 1);
 		}
 
 		// move forward: key + value + nested tokens
@@ -46,40 +47,10 @@ jsmntok_t* JsonHashTable::getToken(const char* desiredKey)
 	}
 
 	// nothing found, return NULL
-	return 0; 
-}
-
-bool JsonHashTable::containsKey(const char* key)
-{
-	return getToken(key) != 0;
-}
-
-JsonArray JsonHashTable::getArray(const char* key)
-{
-	return JsonArray(json, getToken(key));
-}
-
-bool JsonHashTable::getBool(const char* key)
-{
-	return getBoolFromToken(getToken(key));
-}
-
-double JsonHashTable::getDouble(const char* key)
-{
-	return getDoubleFromToken(getToken(key));
-}
-
-JsonHashTable JsonHashTable::getHashTable(const char* key)
-{
-	return JsonHashTable(json, getToken(key));
-}
-
-long JsonHashTable::getLong(const char* key)
-{
-	return getLongFromToken(getToken(key));
+    return JsonValue();
 }
 
-char* JsonHashTable::getString(const char* key)
+JsonArray JsonHashTable::getArray(const char* key) DEPRECATED
 {
-	return getStringFromToken(getToken(key));
+    return (JsonArray) (*this)[key];
 }

+ 36 - 9
JsonParser/JsonHashTable.h

@@ -6,6 +6,9 @@
 #pragma once
 
 #include "JsonObjectBase.h"
+#include "JsonValue.h"
+
+#define DEPRECATED
 
 namespace ArduinoJson
 {
@@ -16,25 +19,49 @@ namespace ArduinoJson
         class JsonHashTable : public JsonObjectBase
         {
             friend class JsonParserBase;
-            friend class JsonArray;
+            friend class JsonValue;
 
         public:
 
             JsonHashTable() {}
 
-            bool containsKey(const char* key);
+            JsonValue operator[](const char* key);
+
+            bool containsKey(const char* key)
+            {
+                return (*this)[key].success();
+            }
+
+            JsonArray getArray(const char* key) DEPRECATED;
+
+            bool getBool(const char* key) DEPRECATED
+            {
+                return (bool) (*this)[key];
+            }
+
+            double getDouble(const char* key) DEPRECATED
+            {
+                return (double) (*this)[key];
+            }
+
+            JsonHashTable getHashTable(const char* key) DEPRECATED
+            {
+                return (JsonHashTable) (*this)[key];
+            }
+
+            long getLong(const char* key) DEPRECATED
+            {
+                return (long) (*this)[key];
+            }
 
-            JsonArray getArray(const char* key);
-            bool getBool(const char* key);
-            double getDouble(const char* key);
-            JsonHashTable getHashTable(const char* key);
-            long getLong(const char* key);
-            char* getString(const char* key);
+            char* getString(const char* key) DEPRECATED
+            {
+                return (char*) (*this)[key];
+            }
 
         private:
 
             JsonHashTable(char* json, jsmntok_t* tokens);
-            jsmntok_t* getToken(const char* key);
         };
     }
 }

+ 0 - 43
JsonParser/JsonObjectBase.cpp

@@ -3,7 +3,6 @@
 * Benoit Blanchon 2014 - MIT License
 */
 
-#include <stdlib.h> // for strtol, strtod
 #include "JsonObjectBase.h"
 
 using namespace ArduinoJson::Parser;
@@ -22,46 +21,4 @@ int JsonObjectBase::getNestedTokenCount(jsmntok_t* token)
     }
 
     return count;
-}
-
-bool JsonObjectBase::getBoolFromToken(jsmntok_t* token)
-{
-    if (token == 0 || token->type != JSMN_PRIMITIVE) return 0;
-
-    // "true"
-    if (json[token->start] == 't') return true;
-
-    // "false"
-    if (json[token->start] == 'f') return false;
-
-    // "null"
-    if (json[token->start] == 'n') return false;
-    
-    // number
-    return strtol(json + token->start, 0, 0) != 0;
-}
-
-double JsonObjectBase::getDoubleFromToken(jsmntok_t* token)
-{
-    if (token == 0 || token->type != JSMN_PRIMITIVE) return 0;
-
-    return strtod(json + token->start, 0);
-}
-
-long JsonObjectBase::getLongFromToken(jsmntok_t* token)
-{
-    if (token == 0 || token->type != JSMN_PRIMITIVE) return 0;
-
-    return strtol(json + token->start, 0, 0);
-}
-
-char* JsonObjectBase::getStringFromToken(jsmntok_t* token)
-{
-    if (token == 0 || token->type != JSMN_PRIMITIVE && token->type != JSMN_STRING)
-        return 0;
-
-    // add null terminator to the string
-    json[token->end] = 0;
-
-    return json + token->start;
 }

+ 0 - 5
JsonParser/JsonObjectBase.h

@@ -41,11 +41,6 @@ namespace ArduinoJson
 
             static int getNestedTokenCount(jsmntok_t* token);
 
-            bool getBoolFromToken(jsmntok_t* token);
-            double getDoubleFromToken(jsmntok_t* token);
-            long getLongFromToken(jsmntok_t* token);
-            char* getStringFromToken(jsmntok_t* token);
-
             char* json;
             jsmntok_t* tokens;
         };

+ 63 - 0
JsonParser/JsonValue.cpp

@@ -0,0 +1,63 @@
+/*
+ * Arduino JSON library
+ * Benoit Blanchon 2014 - MIT License
+ */
+
+#include <stdlib.h> // for strtol, strtod
+#include "JsonArray.h"
+#include "JsonHashTable.h"
+#include "JsonValue.h"
+
+using namespace ArduinoJson::Parser;
+
+JsonValue::operator bool()
+{
+    if (token == 0 || token->type != JSMN_PRIMITIVE) return 0;
+
+    // "true"
+    if (json[token->start] == 't') return true;
+
+    // "false"
+    if (json[token->start] == 'f') return false;
+
+    // "null"
+    if (json[token->start] == 'n') return false;
+
+    // number
+    return strtol(json + token->start, 0, 0) != 0;
+}
+
+JsonValue::operator double()
+{
+    if (token == 0 || token->type != JSMN_PRIMITIVE) return 0;
+
+    return strtod(json + token->start, 0);
+}
+
+JsonValue::operator long()
+{
+    if (token == 0 || token->type != JSMN_PRIMITIVE) return 0;
+
+    return strtol(json + token->start, 0, 0);
+}
+
+JsonValue::operator char*()
+{
+    if (token == 0 || token->type != JSMN_PRIMITIVE && token->type != JSMN_STRING)
+        return 0;
+
+    // add null terminator to the string
+    json[token->end] = 0;
+
+    return json + token->start;
+}
+
+JsonValue::operator JsonArray()
+{
+    return JsonArray(json, token);
+}
+
+JsonValue::operator JsonHashTable()
+{
+    return JsonHashTable(json, token);
+}

+ 52 - 0
JsonParser/JsonValue.h

@@ -0,0 +1,52 @@
+/*
+ * Arduino JSON library
+ * Benoit Blanchon 2014 - MIT License
+ */
+
+#pragma once
+
+#include "jsmn.h"
+
+namespace ArduinoJson
+{
+    namespace Parser
+    {
+        class JsonArray;
+        class JsonHashTable;
+
+        class JsonValue
+        {
+            friend JsonArray;
+            friend JsonHashTable;
+
+        public:
+            bool success()
+            {
+                return token != 0;
+            }
+
+            operator bool();
+            operator double();
+            operator long();
+            operator char*();
+            operator JsonArray();
+            operator JsonHashTable();
+
+        private:
+            JsonValue()
+                : json(0), token(0)
+            {
+
+            }
+
+            JsonValue(char* json, jsmntok_t* token)
+                : json(json), token(token)
+            {
+
+            }
+
+            char* json;
+            jsmntok_t* token;
+        };
+    }
+}

+ 2 - 0
JsonParserTests/JsonParserTests.vcxproj

@@ -90,6 +90,7 @@
     <ClCompile Include="..\JsonParser\JsonHashTable.cpp" />
     <ClCompile Include="..\JsonParser\JsonObjectBase.cpp" />
     <ClCompile Include="..\JsonParser\JsonParserBase.cpp" />
+    <ClCompile Include="..\JsonParser\JsonValue.cpp" />
     <ClCompile Include="JsonArrayTests.cpp" />
     <ClCompile Include="JsonHashTableTests.cpp" />
     <ClCompile Include="GbathreeBug.cpp" />
@@ -101,6 +102,7 @@
     <ClInclude Include="..\JsonParser\JsonObjectBase.h" />
     <ClInclude Include="..\JsonParser\JsonParser.h" />
     <ClInclude Include="..\JsonParser\JsonParserBase.h" />
+    <ClInclude Include="..\JsonParser\JsonValue.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">

+ 6 - 0
JsonParserTests/JsonParserTests.vcxproj.filters

@@ -39,6 +39,9 @@
     <ClCompile Include="..\JsonParser\JsonParserBase.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="..\JsonParser\JsonValue.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\JsonParser\jsmn.h">
@@ -59,5 +62,8 @@
     <ClInclude Include="..\JsonParser\JsonParserBase.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\JsonParser\JsonValue.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>