json lib
Dependents: grove_stream_jpa_sd2 grove_stream_jpa_sd2 grove_stream_jpa_sd2-2 grove_stream_jpa_sd2-3 ... more
Diff: Json.cpp
- Revision:
- 0:7f4a18b3fd82
- Child:
- 3:fab591fca1e7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Json.cpp Fri May 13 06:07:34 2016 +0000 @@ -0,0 +1,95 @@ +#include "Json.h" +#include "debug.h" + +Json::Json ( const char * jsonString, size_t length ) + : source(jsonString), sourceLength(length) +{ + jsmn_parser parser; + int count = 100;//jsmn_parse ( &parser, jsonString, length, NULL, 16384 ); + tokens = new jsmntok_t [ count ]; + + jsmn_init ( &parser ); + tokenCount = jsmn_parse ( &parser, jsonString, length, tokens, count ); +} + +Json::~Json() +{ + delete [] tokens; +} + +int Json::findKeyIndexIn ( const char * key, const int &parentIndex ) const +{ + int retVal = -1; + + if ( parentIndex != -1 && parentIndex < tokenCount ) { + + for ( int i = parentIndex + 1; i < tokenCount; i ++ ) { + + jsmntok_t t = tokens [ i ]; + + if ( t.end >= tokens [ parentIndex ].end ) { + break; + } + + if ( ( t.type == JSMN_KEY ) && ( t.parent == parentIndex ) ) { + int keyLength = t.end - t.start; + if ( ( strlen ( key ) == keyLength ) && ( strncmp ( source + t.start, key, keyLength ) == 0 ) ) { + retVal = i; + break; + } + } + } + } + + return retVal; +} + +int Json::findChildIndexOf ( const int &parentIndex, const int &startingAt ) const +{ + int retVal = -1; + + if ( parentIndex != -1 && parentIndex < tokenCount ) { + + jsmntype_t type = tokens [ parentIndex ].type; + if ( ( type == JSMN_KEY ) || ( type == JSMN_OBJECT ) || ( type == JSMN_ARRAY ) ) { + int i = startingAt + 1; + if ( startingAt < 0 ) { + i = 0; + } + + for( ; i < tokenCount; i ++ ) { + if ( tokens [ i ].parent == parentIndex ) { + retVal = i; + break; + } + } + } + } + + return retVal; +} + +bool Json::matches ( const int & tokenIndex, const char * value ) const +{ + jsmntok_t token = tokens [ tokenIndex ]; + return ( strncmp ( source + token.start, value, ( token.end - token.start ) ) == 0 ); +} + +void Json::print () const +{ + #ifdef SOFTWARE_DEBUG + const char * TYPES [] = { + "UNDEFINED", + "OBJECT ", + "ARRAY ", + "STRING ", + "PRIMITIVE", + "KEY " + }; + + for ( int i = 0; i < tokenCount; i ++ ) { + 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 ); + } + debug ( "" ); + #endif +}