iot_water_monitor_v2

Dependencies:   easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code

Committer:
DuyLionTran
Date:
Tue Apr 03 17:03:01 2018 +0000
Revision:
57:898fcb6692cd
Parent:
43:dcde0e66874a
;   * version 2.9.8  	03-04-2018  Minor changes. Time frame updated to IBM Watson every 60s

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DuyLionTran 43:dcde0e66874a 1 /* Json.cpp */
DuyLionTran 43:dcde0e66874a 2 /* Original Author: Faheem Inayat
DuyLionTran 43:dcde0e66874a 3 * Created by "Night Crue" Team @ TechShop San Jose, CA
DuyLionTran 43:dcde0e66874a 4 *
DuyLionTran 43:dcde0e66874a 5 * MIT License
DuyLionTran 43:dcde0e66874a 6 *
DuyLionTran 43:dcde0e66874a 7 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
DuyLionTran 43:dcde0e66874a 8 * and associated documentation files (the "Software"), to deal in the Software without restriction,
DuyLionTran 43:dcde0e66874a 9 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
DuyLionTran 43:dcde0e66874a 10 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
DuyLionTran 43:dcde0e66874a 11 * furnished to do so, subject to the following conditions:
DuyLionTran 43:dcde0e66874a 12 *
DuyLionTran 43:dcde0e66874a 13 * The above copyright notice and this permission notice shall be included in all copies or
DuyLionTran 43:dcde0e66874a 14 * substantial portions of the Software.
DuyLionTran 43:dcde0e66874a 15 *
DuyLionTran 43:dcde0e66874a 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
DuyLionTran 43:dcde0e66874a 17 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
DuyLionTran 43:dcde0e66874a 18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DuyLionTran 43:dcde0e66874a 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
DuyLionTran 43:dcde0e66874a 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
DuyLionTran 43:dcde0e66874a 21 */
DuyLionTran 43:dcde0e66874a 22
DuyLionTran 43:dcde0e66874a 23 #include "Json.h"
DuyLionTran 43:dcde0e66874a 24
DuyLionTran 43:dcde0e66874a 25 Json::Json ( const char * jsonString, size_t length, unsigned int maxTokens )
DuyLionTran 43:dcde0e66874a 26 : maxTokenCount ( maxTokens ), source ( jsonString ), sourceLength ( length )
DuyLionTran 43:dcde0e66874a 27 {
DuyLionTran 43:dcde0e66874a 28 jsmn_parser parser;
DuyLionTran 43:dcde0e66874a 29 tokens = new jsmntok_t [ maxTokenCount ];
DuyLionTran 43:dcde0e66874a 30
DuyLionTran 43:dcde0e66874a 31 jsmn_init ( &parser );
DuyLionTran 43:dcde0e66874a 32 tokenCount = jsmn_parse ( &parser, jsonString, length, tokens, maxTokenCount );
DuyLionTran 43:dcde0e66874a 33 }
DuyLionTran 43:dcde0e66874a 34
DuyLionTran 43:dcde0e66874a 35 Json::Json ( const Json & )
DuyLionTran 43:dcde0e66874a 36 : maxTokenCount ( 0 ), source ( NULL ), sourceLength ( 0 )
DuyLionTran 43:dcde0e66874a 37 {
DuyLionTran 43:dcde0e66874a 38 tokenCount = 0;
DuyLionTran 43:dcde0e66874a 39 tokens = NULL;
DuyLionTran 43:dcde0e66874a 40 }
DuyLionTran 43:dcde0e66874a 41
DuyLionTran 43:dcde0e66874a 42 Json::~Json ()
DuyLionTran 43:dcde0e66874a 43 {
DuyLionTran 43:dcde0e66874a 44 delete [] tokens;
DuyLionTran 43:dcde0e66874a 45 }
DuyLionTran 43:dcde0e66874a 46
DuyLionTran 43:dcde0e66874a 47 int Json::findKeyIndex ( const char * key, const int &startingAt ) const
DuyLionTran 43:dcde0e66874a 48 {
DuyLionTran 43:dcde0e66874a 49 int retVal = -1;
DuyLionTran 43:dcde0e66874a 50
DuyLionTran 43:dcde0e66874a 51 int i = startingAt + 1;
DuyLionTran 43:dcde0e66874a 52 if ( i < 0 ) {
DuyLionTran 43:dcde0e66874a 53 i = 0;
DuyLionTran 43:dcde0e66874a 54 }
DuyLionTran 43:dcde0e66874a 55
DuyLionTran 43:dcde0e66874a 56 for ( ; i < tokenCount; i++ )
DuyLionTran 43:dcde0e66874a 57 {
DuyLionTran 43:dcde0e66874a 58 jsmntok_t t = tokens [ i ];
DuyLionTran 43:dcde0e66874a 59
DuyLionTran 43:dcde0e66874a 60 if ( t.type == JSMN_KEY )
DuyLionTran 43:dcde0e66874a 61 {
DuyLionTran 43:dcde0e66874a 62 size_t keyLength = (size_t) ( t.end - t.start );
DuyLionTran 43:dcde0e66874a 63 if ( ( strlen ( key ) == keyLength ) && ( strncmp ( source + t.start, key, keyLength ) == 0 ) )
DuyLionTran 43:dcde0e66874a 64 {
DuyLionTran 43:dcde0e66874a 65 retVal = i;
DuyLionTran 43:dcde0e66874a 66 break;
DuyLionTran 43:dcde0e66874a 67 }
DuyLionTran 43:dcde0e66874a 68 }
DuyLionTran 43:dcde0e66874a 69 }
DuyLionTran 43:dcde0e66874a 70
DuyLionTran 43:dcde0e66874a 71 return retVal;
DuyLionTran 43:dcde0e66874a 72 }
DuyLionTran 43:dcde0e66874a 73
DuyLionTran 43:dcde0e66874a 74 int Json::findKeyIndexIn ( const char * key, const int &parentIndex ) const
DuyLionTran 43:dcde0e66874a 75 {
DuyLionTran 43:dcde0e66874a 76 int retVal = -1;
DuyLionTran 43:dcde0e66874a 77
DuyLionTran 43:dcde0e66874a 78 if ( isValidToken ( parentIndex ) )
DuyLionTran 43:dcde0e66874a 79 {
DuyLionTran 43:dcde0e66874a 80 for ( int i = parentIndex + 1; i < tokenCount; i++ )
DuyLionTran 43:dcde0e66874a 81 {
DuyLionTran 43:dcde0e66874a 82 jsmntok_t t = tokens [ i ];
DuyLionTran 43:dcde0e66874a 83
DuyLionTran 43:dcde0e66874a 84 if ( t.end >= tokens [ parentIndex ].end )
DuyLionTran 43:dcde0e66874a 85 {
DuyLionTran 43:dcde0e66874a 86 break;
DuyLionTran 43:dcde0e66874a 87 }
DuyLionTran 43:dcde0e66874a 88
DuyLionTran 43:dcde0e66874a 89 if ( ( t.type == JSMN_KEY ) && ( t.parent == parentIndex ) )
DuyLionTran 43:dcde0e66874a 90 {
DuyLionTran 43:dcde0e66874a 91 size_t keyLength = (size_t) ( t.end - t.start );
DuyLionTran 43:dcde0e66874a 92 if ( ( strlen ( key ) == keyLength ) && ( strncmp ( source + t.start, key, keyLength ) == 0 ) )
DuyLionTran 43:dcde0e66874a 93 {
DuyLionTran 43:dcde0e66874a 94 retVal = i;
DuyLionTran 43:dcde0e66874a 95 break;
DuyLionTran 43:dcde0e66874a 96 }
DuyLionTran 43:dcde0e66874a 97 }
DuyLionTran 43:dcde0e66874a 98 }
DuyLionTran 43:dcde0e66874a 99 }
DuyLionTran 43:dcde0e66874a 100
DuyLionTran 43:dcde0e66874a 101 return retVal;
DuyLionTran 43:dcde0e66874a 102 }
DuyLionTran 43:dcde0e66874a 103
DuyLionTran 43:dcde0e66874a 104 int Json::findChildIndexOf ( const int &parentIndex, const int &startingAt ) const
DuyLionTran 43:dcde0e66874a 105 {
DuyLionTran 43:dcde0e66874a 106 int retVal = -1;
DuyLionTran 43:dcde0e66874a 107
DuyLionTran 43:dcde0e66874a 108 if ( isValidToken ( parentIndex ) )
DuyLionTran 43:dcde0e66874a 109 {
DuyLionTran 43:dcde0e66874a 110
DuyLionTran 43:dcde0e66874a 111 jsmntype_t type = tokens [ parentIndex ].type;
DuyLionTran 43:dcde0e66874a 112 if ( ( type == JSMN_KEY ) || ( type == JSMN_OBJECT ) || ( type == JSMN_ARRAY ) )
DuyLionTran 43:dcde0e66874a 113 {
DuyLionTran 43:dcde0e66874a 114 int i = startingAt + 1;
DuyLionTran 43:dcde0e66874a 115 if ( startingAt < 0 )
DuyLionTran 43:dcde0e66874a 116 {
DuyLionTran 43:dcde0e66874a 117 i = 0;
DuyLionTran 43:dcde0e66874a 118 }
DuyLionTran 43:dcde0e66874a 119
DuyLionTran 43:dcde0e66874a 120 for ( i += parentIndex; i < tokenCount; i++ )
DuyLionTran 43:dcde0e66874a 121 {
DuyLionTran 43:dcde0e66874a 122 if ( tokens [ i ].parent == parentIndex )
DuyLionTran 43:dcde0e66874a 123 {
DuyLionTran 43:dcde0e66874a 124 retVal = i;
DuyLionTran 43:dcde0e66874a 125 break;
DuyLionTran 43:dcde0e66874a 126 }
DuyLionTran 43:dcde0e66874a 127 }
DuyLionTran 43:dcde0e66874a 128 }
DuyLionTran 43:dcde0e66874a 129 }
DuyLionTran 43:dcde0e66874a 130
DuyLionTran 43:dcde0e66874a 131 return retVal;
DuyLionTran 43:dcde0e66874a 132 }
DuyLionTran 43:dcde0e66874a 133
DuyLionTran 43:dcde0e66874a 134 bool Json::matches ( const int & tokenIndex, const char * value ) const
DuyLionTran 43:dcde0e66874a 135 {
DuyLionTran 43:dcde0e66874a 136 bool retVal = false;
DuyLionTran 43:dcde0e66874a 137
DuyLionTran 43:dcde0e66874a 138 if ( isValidToken ( tokenIndex ) )
DuyLionTran 43:dcde0e66874a 139 {
DuyLionTran 43:dcde0e66874a 140 jsmntok_t token = tokens [ tokenIndex ];
DuyLionTran 43:dcde0e66874a 141 retVal = ( strncmp ( source + token.start, value, ( token.end - token.start ) ) == 0 );
DuyLionTran 43:dcde0e66874a 142 }
DuyLionTran 43:dcde0e66874a 143
DuyLionTran 43:dcde0e66874a 144 return retVal;
DuyLionTran 43:dcde0e66874a 145 }
DuyLionTran 43:dcde0e66874a 146
DuyLionTran 43:dcde0e66874a 147 int Json::tokenIntegerValue ( const int tokenIndex, int &returnValue ) const
DuyLionTran 43:dcde0e66874a 148 {
DuyLionTran 43:dcde0e66874a 149 int retVal = -1;
DuyLionTran 43:dcde0e66874a 150
DuyLionTran 43:dcde0e66874a 151 if ( type ( tokenIndex ) == JSMN_PRIMITIVE )
DuyLionTran 43:dcde0e66874a 152 {
DuyLionTran 43:dcde0e66874a 153 int len = tokenLength ( tokenIndex );
DuyLionTran 43:dcde0e66874a 154 char * tok = new char [ len + 1 ];
DuyLionTran 43:dcde0e66874a 155 strncpy ( tok, tokenAddress ( tokenIndex ), len );
DuyLionTran 43:dcde0e66874a 156 tok [ len ] = 0;
DuyLionTran 43:dcde0e66874a 157 returnValue = atoi ( tok );
DuyLionTran 43:dcde0e66874a 158 delete [] tok;
DuyLionTran 43:dcde0e66874a 159 retVal = 0;
DuyLionTran 43:dcde0e66874a 160 }
DuyLionTran 43:dcde0e66874a 161 return retVal;
DuyLionTran 43:dcde0e66874a 162 }
DuyLionTran 43:dcde0e66874a 163
DuyLionTran 43:dcde0e66874a 164 int Json::tokenNumberValue ( const int tokenIndex, float &returnValue ) const
DuyLionTran 43:dcde0e66874a 165 {
DuyLionTran 43:dcde0e66874a 166 int retVal = -1;
DuyLionTran 43:dcde0e66874a 167
DuyLionTran 43:dcde0e66874a 168 if ( type ( tokenIndex ) == JSMN_PRIMITIVE )
DuyLionTran 43:dcde0e66874a 169 {
DuyLionTran 43:dcde0e66874a 170 int len = tokenLength ( tokenIndex );
DuyLionTran 43:dcde0e66874a 171 char * tok = new char [ len + 1 ];
DuyLionTran 43:dcde0e66874a 172 strncpy ( tok, tokenAddress ( tokenIndex ), len );
DuyLionTran 43:dcde0e66874a 173 tok [ len ] = 0;
DuyLionTran 43:dcde0e66874a 174 returnValue = atof ( tok );
DuyLionTran 43:dcde0e66874a 175 delete [] tok;
DuyLionTran 43:dcde0e66874a 176 retVal = 0;
DuyLionTran 43:dcde0e66874a 177 }
DuyLionTran 43:dcde0e66874a 178
DuyLionTran 43:dcde0e66874a 179 return retVal;
DuyLionTran 43:dcde0e66874a 180 }
DuyLionTran 43:dcde0e66874a 181
DuyLionTran 43:dcde0e66874a 182 int Json::tokenBooleanValue ( const int tokenIndex, bool &returnValue ) const
DuyLionTran 43:dcde0e66874a 183 {
DuyLionTran 43:dcde0e66874a 184 int retVal = -1;
DuyLionTran 43:dcde0e66874a 185
DuyLionTran 43:dcde0e66874a 186 if ( type ( tokenIndex ) == JSMN_PRIMITIVE )
DuyLionTran 43:dcde0e66874a 187 {
DuyLionTran 43:dcde0e66874a 188 returnValue = matches ( tokenIndex, "true" );
DuyLionTran 43:dcde0e66874a 189 retVal = 0;
DuyLionTran 43:dcde0e66874a 190 }
DuyLionTran 43:dcde0e66874a 191
DuyLionTran 43:dcde0e66874a 192 return retVal;
DuyLionTran 43:dcde0e66874a 193 }
DuyLionTran 43:dcde0e66874a 194
DuyLionTran 43:dcde0e66874a 195 char * Json::unescape ( char * jsonString )
DuyLionTran 43:dcde0e66874a 196 {
DuyLionTran 43:dcde0e66874a 197 if ( jsonString != NULL )
DuyLionTran 43:dcde0e66874a 198 {
DuyLionTran 43:dcde0e66874a 199 int stringIndex = 0;
DuyLionTran 43:dcde0e66874a 200 int indentLevel = 0;
DuyLionTran 43:dcde0e66874a 201 int quoteCount = 0;
DuyLionTran 43:dcde0e66874a 202 for ( int i = 0; jsonString [ i ] != 0; i ++ )
DuyLionTran 43:dcde0e66874a 203 {
DuyLionTran 43:dcde0e66874a 204 switch ( jsonString [ i ] )
DuyLionTran 43:dcde0e66874a 205 {
DuyLionTran 43:dcde0e66874a 206 case '{':
DuyLionTran 43:dcde0e66874a 207 indentLevel ++;
DuyLionTran 43:dcde0e66874a 208 break;
DuyLionTran 43:dcde0e66874a 209
DuyLionTran 43:dcde0e66874a 210 case '}':
DuyLionTran 43:dcde0e66874a 211 indentLevel --;
DuyLionTran 43:dcde0e66874a 212 if ( indentLevel == 0 ) {
DuyLionTran 43:dcde0e66874a 213 // Just close and return the first valid JSON object. No need to handle complex cases.
DuyLionTran 43:dcde0e66874a 214 jsonString [ stringIndex ++ ] = '}';
DuyLionTran 43:dcde0e66874a 215 jsonString [ stringIndex ] = 0;
DuyLionTran 43:dcde0e66874a 216 return jsonString;
DuyLionTran 43:dcde0e66874a 217 }
DuyLionTran 43:dcde0e66874a 218 break;
DuyLionTran 43:dcde0e66874a 219
DuyLionTran 43:dcde0e66874a 220 case '\\':
DuyLionTran 43:dcde0e66874a 221 i ++;
DuyLionTran 43:dcde0e66874a 222 break;
DuyLionTran 43:dcde0e66874a 223
DuyLionTran 43:dcde0e66874a 224 case '"':
DuyLionTran 43:dcde0e66874a 225 quoteCount ++;
DuyLionTran 43:dcde0e66874a 226 break;
DuyLionTran 43:dcde0e66874a 227 }
DuyLionTran 43:dcde0e66874a 228
DuyLionTran 43:dcde0e66874a 229 if ( indentLevel > 0 )
DuyLionTran 43:dcde0e66874a 230 {
DuyLionTran 43:dcde0e66874a 231 if ( quoteCount == 0 ) {
DuyLionTran 43:dcde0e66874a 232 return jsonString; //No need to unescape. JsonString needs to be already escaped
DuyLionTran 43:dcde0e66874a 233 }
DuyLionTran 43:dcde0e66874a 234 jsonString [ stringIndex ++ ] = jsonString [ i ];
DuyLionTran 43:dcde0e66874a 235 }
DuyLionTran 43:dcde0e66874a 236 }
DuyLionTran 43:dcde0e66874a 237 jsonString [ stringIndex ] = 0;
DuyLionTran 43:dcde0e66874a 238 }
DuyLionTran 43:dcde0e66874a 239
DuyLionTran 43:dcde0e66874a 240 return jsonString;
DuyLionTran 43:dcde0e66874a 241 }