json lib
Dependents: grove_stream_jpa_sd2 grove_stream_jpa_sd2 grove_stream_jpa_sd2-2 grove_stream_jpa_sd2-3 ... more
Json.cpp@0:7f4a18b3fd82, 2016-05-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |