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:
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 }