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:
Fri May 13 06:07:34 2016 +0000
Revision:
0:7f4a18b3fd82
Child:
3:fab591fca1e7
First cut code commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mercurywaters 0:7f4a18b3fd82 1 #include "Json.h"
mercurywaters 0:7f4a18b3fd82 2 #include "debug.h"
mercurywaters 0:7f4a18b3fd82 3
mercurywaters 0:7f4a18b3fd82 4 Json::Json ( const char * jsonString, size_t length )
mercurywaters 0:7f4a18b3fd82 5 : source(jsonString), sourceLength(length)
mercurywaters 0:7f4a18b3fd82 6 {
mercurywaters 0:7f4a18b3fd82 7 jsmn_parser parser;
mercurywaters 0:7f4a18b3fd82 8 int count = 100;//jsmn_parse ( &parser, jsonString, length, NULL, 16384 );
mercurywaters 0:7f4a18b3fd82 9 tokens = new jsmntok_t [ count ];
mercurywaters 0:7f4a18b3fd82 10
mercurywaters 0:7f4a18b3fd82 11 jsmn_init ( &parser );
mercurywaters 0:7f4a18b3fd82 12 tokenCount = jsmn_parse ( &parser, jsonString, length, tokens, count );
mercurywaters 0:7f4a18b3fd82 13 }
mercurywaters 0:7f4a18b3fd82 14
mercurywaters 0:7f4a18b3fd82 15 Json::~Json()
mercurywaters 0:7f4a18b3fd82 16 {
mercurywaters 0:7f4a18b3fd82 17 delete [] tokens;
mercurywaters 0:7f4a18b3fd82 18 }
mercurywaters 0:7f4a18b3fd82 19
mercurywaters 0:7f4a18b3fd82 20 int Json::findKeyIndexIn ( const char * key, const int &parentIndex ) const
mercurywaters 0:7f4a18b3fd82 21 {
mercurywaters 0:7f4a18b3fd82 22 int retVal = -1;
mercurywaters 0:7f4a18b3fd82 23
mercurywaters 0:7f4a18b3fd82 24 if ( parentIndex != -1 && parentIndex < tokenCount ) {
mercurywaters 0:7f4a18b3fd82 25
mercurywaters 0:7f4a18b3fd82 26 for ( int i = parentIndex + 1; i < tokenCount; i ++ ) {
mercurywaters 0:7f4a18b3fd82 27
mercurywaters 0:7f4a18b3fd82 28 jsmntok_t t = tokens [ i ];
mercurywaters 0:7f4a18b3fd82 29
mercurywaters 0:7f4a18b3fd82 30 if ( t.end >= tokens [ parentIndex ].end ) {
mercurywaters 0:7f4a18b3fd82 31 break;
mercurywaters 0:7f4a18b3fd82 32 }
mercurywaters 0:7f4a18b3fd82 33
mercurywaters 0:7f4a18b3fd82 34 if ( ( t.type == JSMN_KEY ) && ( t.parent == parentIndex ) ) {
mercurywaters 0:7f4a18b3fd82 35 int keyLength = t.end - t.start;
mercurywaters 0:7f4a18b3fd82 36 if ( ( strlen ( key ) == keyLength ) && ( strncmp ( source + t.start, key, keyLength ) == 0 ) ) {
mercurywaters 0:7f4a18b3fd82 37 retVal = i;
mercurywaters 0:7f4a18b3fd82 38 break;
mercurywaters 0:7f4a18b3fd82 39 }
mercurywaters 0:7f4a18b3fd82 40 }
mercurywaters 0:7f4a18b3fd82 41 }
mercurywaters 0:7f4a18b3fd82 42 }
mercurywaters 0:7f4a18b3fd82 43
mercurywaters 0:7f4a18b3fd82 44 return retVal;
mercurywaters 0:7f4a18b3fd82 45 }
mercurywaters 0:7f4a18b3fd82 46
mercurywaters 0:7f4a18b3fd82 47 int Json::findChildIndexOf ( const int &parentIndex, const int &startingAt ) const
mercurywaters 0:7f4a18b3fd82 48 {
mercurywaters 0:7f4a18b3fd82 49 int retVal = -1;
mercurywaters 0:7f4a18b3fd82 50
mercurywaters 0:7f4a18b3fd82 51 if ( parentIndex != -1 && parentIndex < tokenCount ) {
mercurywaters 0:7f4a18b3fd82 52
mercurywaters 0:7f4a18b3fd82 53 jsmntype_t type = tokens [ parentIndex ].type;
mercurywaters 0:7f4a18b3fd82 54 if ( ( type == JSMN_KEY ) || ( type == JSMN_OBJECT ) || ( type == JSMN_ARRAY ) ) {
mercurywaters 0:7f4a18b3fd82 55 int i = startingAt + 1;
mercurywaters 0:7f4a18b3fd82 56 if ( startingAt < 0 ) {
mercurywaters 0:7f4a18b3fd82 57 i = 0;
mercurywaters 0:7f4a18b3fd82 58 }
mercurywaters 0:7f4a18b3fd82 59
mercurywaters 0:7f4a18b3fd82 60 for( ; i < tokenCount; i ++ ) {
mercurywaters 0:7f4a18b3fd82 61 if ( tokens [ i ].parent == parentIndex ) {
mercurywaters 0:7f4a18b3fd82 62 retVal = i;
mercurywaters 0:7f4a18b3fd82 63 break;
mercurywaters 0:7f4a18b3fd82 64 }
mercurywaters 0:7f4a18b3fd82 65 }
mercurywaters 0:7f4a18b3fd82 66 }
mercurywaters 0:7f4a18b3fd82 67 }
mercurywaters 0:7f4a18b3fd82 68
mercurywaters 0:7f4a18b3fd82 69 return retVal;
mercurywaters 0:7f4a18b3fd82 70 }
mercurywaters 0:7f4a18b3fd82 71
mercurywaters 0:7f4a18b3fd82 72 bool Json::matches ( const int & tokenIndex, const char * value ) const
mercurywaters 0:7f4a18b3fd82 73 {
mercurywaters 0:7f4a18b3fd82 74 jsmntok_t token = tokens [ tokenIndex ];
mercurywaters 0:7f4a18b3fd82 75 return ( strncmp ( source + token.start, value, ( token.end - token.start ) ) == 0 );
mercurywaters 0:7f4a18b3fd82 76 }
mercurywaters 0:7f4a18b3fd82 77
mercurywaters 0:7f4a18b3fd82 78 void Json::print () const
mercurywaters 0:7f4a18b3fd82 79 {
mercurywaters 0:7f4a18b3fd82 80 #ifdef SOFTWARE_DEBUG
mercurywaters 0:7f4a18b3fd82 81 const char * TYPES [] = {
mercurywaters 0:7f4a18b3fd82 82 "UNDEFINED",
mercurywaters 0:7f4a18b3fd82 83 "OBJECT ",
mercurywaters 0:7f4a18b3fd82 84 "ARRAY ",
mercurywaters 0:7f4a18b3fd82 85 "STRING ",
mercurywaters 0:7f4a18b3fd82 86 "PRIMITIVE",
mercurywaters 0:7f4a18b3fd82 87 "KEY "
mercurywaters 0:7f4a18b3fd82 88 };
mercurywaters 0:7f4a18b3fd82 89
mercurywaters 0:7f4a18b3fd82 90 for ( int i = 0; i < tokenCount; i ++ ) {
mercurywaters 0:7f4a18b3fd82 91 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 0:7f4a18b3fd82 92 }
mercurywaters 0:7f4a18b3fd82 93 debug ( "" );
mercurywaters 0:7f4a18b3fd82 94 #endif
mercurywaters 0:7f4a18b3fd82 95 }