json lib

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

Committer:
mercurywaters
Date:
Thu Jun 02 06:08:24 2016 +0000
Revision:
3:fab591fca1e7
Parent:
0:7f4a18b3fd82
Child:
4:ae34010d87e5
Added the documentation of JSON class

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mercurywaters 0:7f4a18b3fd82 1 #include "Json.h"
mercurywaters 0:7f4a18b3fd82 2
mercurywaters 0:7f4a18b3fd82 3 Json::Json ( const char * jsonString, size_t length )
mercurywaters 3:fab591fca1e7 4 : source ( jsonString ), sourceLength ( length )
mercurywaters 0:7f4a18b3fd82 5 {
mercurywaters 0:7f4a18b3fd82 6 jsmn_parser parser;
mercurywaters 3:fab591fca1e7 7 int count = 100; //jsmn_parse ( &parser, jsonString, length, NULL, 16384 );
mercurywaters 0:7f4a18b3fd82 8 tokens = new jsmntok_t [ count ];
mercurywaters 3:fab591fca1e7 9
mercurywaters 0:7f4a18b3fd82 10 jsmn_init ( &parser );
mercurywaters 0:7f4a18b3fd82 11 tokenCount = jsmn_parse ( &parser, jsonString, length, tokens, count );
mercurywaters 0:7f4a18b3fd82 12 }
mercurywaters 0:7f4a18b3fd82 13
mercurywaters 3:fab591fca1e7 14 Json::Json ( const Json & other )
mercurywaters 3:fab591fca1e7 15 : source ( NULL ), sourceLength ( 0 )
mercurywaters 3:fab591fca1e7 16 {
mercurywaters 3:fab591fca1e7 17 tokenCount = 0;
mercurywaters 3:fab591fca1e7 18 tokens = NULL;
mercurywaters 3:fab591fca1e7 19 }
mercurywaters 3:fab591fca1e7 20
mercurywaters 3:fab591fca1e7 21 Json::~Json ()
mercurywaters 0:7f4a18b3fd82 22 {
mercurywaters 0:7f4a18b3fd82 23 delete [] tokens;
mercurywaters 0:7f4a18b3fd82 24 }
mercurywaters 0:7f4a18b3fd82 25
mercurywaters 0:7f4a18b3fd82 26 int Json::findKeyIndexIn ( const char * key, const int &parentIndex ) const
mercurywaters 0:7f4a18b3fd82 27 {
mercurywaters 0:7f4a18b3fd82 28 int retVal = -1;
mercurywaters 3:fab591fca1e7 29
mercurywaters 3:fab591fca1e7 30 if ( parentIndex != -1 && parentIndex < tokenCount )
mercurywaters 3:fab591fca1e7 31 {
mercurywaters 3:fab591fca1e7 32
mercurywaters 3:fab591fca1e7 33 for ( int i = parentIndex + 1; i < tokenCount; i++ )
mercurywaters 3:fab591fca1e7 34 {
mercurywaters 3:fab591fca1e7 35
mercurywaters 0:7f4a18b3fd82 36 jsmntok_t t = tokens [ i ];
mercurywaters 3:fab591fca1e7 37
mercurywaters 3:fab591fca1e7 38 if ( t.end >= tokens [ parentIndex ].end )
mercurywaters 3:fab591fca1e7 39 {
mercurywaters 0:7f4a18b3fd82 40 break;
mercurywaters 0:7f4a18b3fd82 41 }
mercurywaters 3:fab591fca1e7 42
mercurywaters 3:fab591fca1e7 43 if ( ( t.type == JSMN_KEY ) && ( t.parent == parentIndex ) )
mercurywaters 3:fab591fca1e7 44 {
mercurywaters 3:fab591fca1e7 45 size_t keyLength = (size_t) ( t.end - t.start );
mercurywaters 3:fab591fca1e7 46 if ( ( strlen ( key ) == keyLength ) && ( strncmp ( source + t.start, key, keyLength ) == 0 ) )
mercurywaters 3:fab591fca1e7 47 {
mercurywaters 0:7f4a18b3fd82 48 retVal = i;
mercurywaters 0:7f4a18b3fd82 49 break;
mercurywaters 0:7f4a18b3fd82 50 }
mercurywaters 0:7f4a18b3fd82 51 }
mercurywaters 0:7f4a18b3fd82 52 }
mercurywaters 0:7f4a18b3fd82 53 }
mercurywaters 3:fab591fca1e7 54
mercurywaters 0:7f4a18b3fd82 55 return retVal;
mercurywaters 0:7f4a18b3fd82 56 }
mercurywaters 0:7f4a18b3fd82 57
mercurywaters 0:7f4a18b3fd82 58 int Json::findChildIndexOf ( const int &parentIndex, const int &startingAt ) const
mercurywaters 0:7f4a18b3fd82 59 {
mercurywaters 0:7f4a18b3fd82 60 int retVal = -1;
mercurywaters 3:fab591fca1e7 61
mercurywaters 3:fab591fca1e7 62 if ( parentIndex != -1 && parentIndex < tokenCount )
mercurywaters 3:fab591fca1e7 63 {
mercurywaters 3:fab591fca1e7 64
mercurywaters 0:7f4a18b3fd82 65 jsmntype_t type = tokens [ parentIndex ].type;
mercurywaters 3:fab591fca1e7 66 if ( ( type == JSMN_KEY ) || ( type == JSMN_OBJECT ) || ( type == JSMN_ARRAY ) )
mercurywaters 3:fab591fca1e7 67 {
mercurywaters 0:7f4a18b3fd82 68 int i = startingAt + 1;
mercurywaters 3:fab591fca1e7 69 if ( startingAt < 0 )
mercurywaters 3:fab591fca1e7 70 {
mercurywaters 0:7f4a18b3fd82 71 i = 0;
mercurywaters 0:7f4a18b3fd82 72 }
mercurywaters 3:fab591fca1e7 73
mercurywaters 3:fab591fca1e7 74 for ( ; i < tokenCount; i++ )
mercurywaters 3:fab591fca1e7 75 {
mercurywaters 3:fab591fca1e7 76 if ( tokens [ i ].parent == parentIndex )
mercurywaters 3:fab591fca1e7 77 {
mercurywaters 0:7f4a18b3fd82 78 retVal = i;
mercurywaters 0:7f4a18b3fd82 79 break;
mercurywaters 0:7f4a18b3fd82 80 }
mercurywaters 0:7f4a18b3fd82 81 }
mercurywaters 0:7f4a18b3fd82 82 }
mercurywaters 0:7f4a18b3fd82 83 }
mercurywaters 3:fab591fca1e7 84
mercurywaters 0:7f4a18b3fd82 85 return retVal;
mercurywaters 0:7f4a18b3fd82 86 }
mercurywaters 0:7f4a18b3fd82 87
mercurywaters 0:7f4a18b3fd82 88 bool Json::matches ( const int & tokenIndex, const char * value ) const
mercurywaters 0:7f4a18b3fd82 89 {
mercurywaters 0:7f4a18b3fd82 90 jsmntok_t token = tokens [ tokenIndex ];
mercurywaters 0:7f4a18b3fd82 91 return ( strncmp ( source + token.start, value, ( token.end - token.start ) ) == 0 );
mercurywaters 0:7f4a18b3fd82 92 }
mercurywaters 0:7f4a18b3fd82 93
mercurywaters 3:fab591fca1e7 94 int Json::tokenIntegerValue ( const int tokenIndex ) const
mercurywaters 3:fab591fca1e7 95 {
mercurywaters 3:fab591fca1e7 96 if ( type ( tokenIndex ) == JSMN_PRIMITIVE )
mercurywaters 3:fab591fca1e7 97 {
mercurywaters 3:fab591fca1e7 98 int len = tokenLength ( tokenIndex );
mercurywaters 3:fab591fca1e7 99 char * tok = new char [ len + 1 ];
mercurywaters 3:fab591fca1e7 100 strncpy ( tok, tokenAddress ( tokenIndex ), len );
mercurywaters 3:fab591fca1e7 101 tok [ len ] = 0;
mercurywaters 3:fab591fca1e7 102 int retVal = atoi ( tok );
mercurywaters 3:fab591fca1e7 103 delete [] tok;
mercurywaters 3:fab591fca1e7 104 return retVal;
mercurywaters 3:fab591fca1e7 105 }
mercurywaters 3:fab591fca1e7 106 return -1;
mercurywaters 3:fab591fca1e7 107 }
mercurywaters 3:fab591fca1e7 108
mercurywaters 3:fab591fca1e7 109 float Json::tokenNumberValue ( const int tokenIndex ) const
mercurywaters 0:7f4a18b3fd82 110 {
mercurywaters 3:fab591fca1e7 111 if ( type ( tokenIndex ) == JSMN_PRIMITIVE )
mercurywaters 3:fab591fca1e7 112 {
mercurywaters 3:fab591fca1e7 113 int len = tokenLength ( tokenIndex );
mercurywaters 3:fab591fca1e7 114 char * tok = new char [ len + 1 ];
mercurywaters 3:fab591fca1e7 115 strncpy ( tok, tokenAddress ( tokenIndex ), len );
mercurywaters 3:fab591fca1e7 116 tok [ len ] = 0;
mercurywaters 3:fab591fca1e7 117 float retVal = atof ( tok );
mercurywaters 3:fab591fca1e7 118 delete [] tok;
mercurywaters 3:fab591fca1e7 119 return retVal;
mercurywaters 3:fab591fca1e7 120 }
mercurywaters 3:fab591fca1e7 121 return -1;
mercurywaters 3:fab591fca1e7 122 }
mercurywaters 3:fab591fca1e7 123
mercurywaters 3:fab591fca1e7 124 inline bool Json::tokenBooleanValue ( const int tokenIndex ) const
mercurywaters 3:fab591fca1e7 125 {
mercurywaters 3:fab591fca1e7 126 if ( type ( tokenIndex ) == JSMN_PRIMITIVE )
mercurywaters 3:fab591fca1e7 127 {
mercurywaters 3:fab591fca1e7 128 return matches ( tokenIndex, "true" );
mercurywaters 3:fab591fca1e7 129 }
mercurywaters 3:fab591fca1e7 130 return false;
mercurywaters 0:7f4a18b3fd82 131 }
mercurywaters 3:fab591fca1e7 132
mercurywaters 3:fab591fca1e7 133 // void Json::print () const
mercurywaters 3:fab591fca1e7 134 // {
mercurywaters 3:fab591fca1e7 135 // #ifdef SOFTWARE_DEBUG
mercurywaters 3:fab591fca1e7 136 // const char * TYPES [] = {
mercurywaters 3:fab591fca1e7 137 // "UNDEFINED",
mercurywaters 3:fab591fca1e7 138 // "OBJECT ",
mercurywaters 3:fab591fca1e7 139 // "ARRAY ",
mercurywaters 3:fab591fca1e7 140 // "STRING ",
mercurywaters 3:fab591fca1e7 141 // "PRIMITIVE",
mercurywaters 3:fab591fca1e7 142 // "KEY "
mercurywaters 3:fab591fca1e7 143 // };
mercurywaters 3:fab591fca1e7 144 //
mercurywaters 3:fab591fca1e7 145 // for ( int i = 0; i < tokenCount; i ++ ) {
mercurywaters 3:fab591fca1e7 146 // debug ( "Index: %3d, Type:%d(%s), Indices: (%3d to %3d), ParentIndex: %3d, ChildCount: %3d Data: %.*s", i, tokens [ i ].type, TYPES [ tokens [ i ].type ], tokens [ i ].start, tokens [ i ].end, tokens [ i ].parent, tokens [ i ].childCount, tokens [ i ].end - tokens [ i ].start, source + tokens [ i ].start );
mercurywaters 3:fab591fca1e7 147 // }
mercurywaters 3:fab591fca1e7 148 // debug ( "" );
mercurywaters 3:fab591fca1e7 149 // #endif
mercurywaters 3:fab591fca1e7 150 // }
mercurywaters 3:fab591fca1e7 151