JSON library based on JSMN lib

Dependents:   ATT_WNCInterface_Info WNCInterface_HTTP_example NerfUS-Coord Mbed_Prototype_copy_4_INNO_day_15_6_2017 ... more

C++ JSON wrapper over JSMN lib (https://github.com/zserge/jsmn).

This C++ Class is a set of common tools/procedures as a C++ wrapper over JSMN JSON parser library. It is intended to provide the boiler-plate code, with intentions to reduce code clutter, in more of C++ fashion.

In contrast to original library, Json is intended to work strictly with valid JSON structures. Non-standard JSON structures should result in an error.

This class works explicitly on the indices returned by underlying JSMN library. In the scope of this class, its function parameters, return types, and documentation, the term 'index' will always mean the index of JSMN tokens, parsed by the Json constructor, unless and until explicitly mentioned otherwise.

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