json lib

Dependents:   grove_stream_jpa_sd2 grove_stream_jpa_sd2 grove_stream_jpa_sd2-2 grove_stream_jpa_sd2-3 ... more

Revision:
4:ae34010d87e5
Parent:
3:fab591fca1e7
Child:
5:dd98cf00ed9b
--- a/Json.cpp	Thu Jun 02 06:08:24 2016 +0000
+++ b/Json.cpp	Tue Aug 02 20:21:04 2016 +0000
@@ -23,6 +23,33 @@
     delete [] tokens;
 }
 
+int Json::findKeyIndex ( const char * key, const int &startingAt ) const
+{
+    int retVal = -1;
+
+    int i = startingAt + 1;
+    if ( i < 0 ) {
+        i = 0;
+    }
+    
+    for ( ; i < tokenCount; i++ )
+    {
+        jsmntok_t t = tokens [ i ];
+
+        if ( t.type == JSMN_KEY )
+        {
+            size_t keyLength = (size_t) ( t.end - t.start );
+            if ( ( strlen ( key ) == keyLength ) && ( strncmp ( source + t.start, key, keyLength ) == 0 ) )
+            {
+                retVal = i;
+                break;
+            }
+        }
+    }
+
+    return retVal;
+}
+
 int Json::findKeyIndexIn ( const char * key, const int &parentIndex ) const
 {
     int retVal = -1;
@@ -121,14 +148,6 @@
     return -1;
 }
 
-inline bool Json::tokenBooleanValue ( const int tokenIndex ) const
-{
-    if ( type ( tokenIndex ) == JSMN_PRIMITIVE )
-    {
-        return matches ( tokenIndex, "true" );
-    }
-    return false;
-}
 
 // void Json::print () const
 // {
@@ -149,3 +168,50 @@
 //     #endif
 // }
 
+char * Json::unescape ( char * jsonString )
+{
+    if ( jsonString != NULL )
+    {
+        int stringIndex = 0;
+        int indentLevel = 0;
+        int quoteCount = 0;
+        for ( int i = 0; jsonString [ i ] != 0; i ++ )
+        {
+            switch ( jsonString [ i ] )
+            {
+                case '{':
+                    indentLevel ++;
+                    break;
+                
+                case '}':
+                    indentLevel --;
+                    if ( indentLevel == 0 ) {
+                        // Just close and return the first valid JSON object.  No need to handle complex cases.
+                        jsonString [ stringIndex ++ ] = '}';
+                        jsonString [ stringIndex ] = 0;
+                        return jsonString;
+                    }
+                    break;
+                    
+                case '\\':
+                    i ++;
+                    break;
+                    
+                case '"':
+                    quoteCount ++;
+                    break;
+            }
+            
+            if ( indentLevel > 0 )
+            {
+                if ( quoteCount == 0 ) {
+                    return jsonString; //No need to unescape.  JsonString needs to be already escaped
+                }
+                jsonString [ stringIndex ++ ] = jsonString [ i ];
+            }
+        }
+        jsonString [ stringIndex ] = 0;
+    }
+    
+    return jsonString;
+}