Evrythng API for W5500, WIZ550io
Dependencies: W5500Interface
Dependents: EvrythngApiExampleW5500
Fork of EvrythngApi by
JsonParser.h@0:d38d192c2f5f, 2012-08-30 (annotated)
- Committer:
- vladounet
- Date:
- Thu Aug 30 13:20:01 2012 +0000
- Revision:
- 0:d38d192c2f5f
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vladounet | 0:d38d192c2f5f | 1 | /* |
vladounet | 0:d38d192c2f5f | 2 | * (c) Copyright 2012 EVRYTHNG Ltd London / Zurich |
vladounet | 0:d38d192c2f5f | 3 | * www.evrythng.com |
vladounet | 0:d38d192c2f5f | 4 | * |
vladounet | 0:d38d192c2f5f | 5 | * --- DISCLAIMER --- |
vladounet | 0:d38d192c2f5f | 6 | * |
vladounet | 0:d38d192c2f5f | 7 | * EVRYTHNG provides this source code "as is" and without warranty of any kind, |
vladounet | 0:d38d192c2f5f | 8 | * and hereby disclaims all express or implied warranties, including without |
vladounet | 0:d38d192c2f5f | 9 | * limitation warranties of merchantability, fitness for a particular purpose, |
vladounet | 0:d38d192c2f5f | 10 | * performance, accuracy, reliability, and non-infringement. |
vladounet | 0:d38d192c2f5f | 11 | * |
vladounet | 0:d38d192c2f5f | 12 | * Author: Michel Yerly |
vladounet | 0:d38d192c2f5f | 13 | * |
vladounet | 0:d38d192c2f5f | 14 | */ |
vladounet | 0:d38d192c2f5f | 15 | #ifndef JSONPARSER_H |
vladounet | 0:d38d192c2f5f | 16 | #define JSONPARSER_H |
vladounet | 0:d38d192c2f5f | 17 | |
vladounet | 0:d38d192c2f5f | 18 | #include <vector> |
vladounet | 0:d38d192c2f5f | 19 | #include <map> |
vladounet | 0:d38d192c2f5f | 20 | #include <string> |
vladounet | 0:d38d192c2f5f | 21 | |
vladounet | 0:d38d192c2f5f | 22 | /* |
vladounet | 0:d38d192c2f5f | 23 | * Possible JSON value types |
vladounet | 0:d38d192c2f5f | 24 | */ |
vladounet | 0:d38d192c2f5f | 25 | enum ValueType { |
vladounet | 0:d38d192c2f5f | 26 | |
vladounet | 0:d38d192c2f5f | 27 | VT_DOUBLE, // Number |
vladounet | 0:d38d192c2f5f | 28 | VT_CHAR_PTR, // String |
vladounet | 0:d38d192c2f5f | 29 | VT_VEC_PTR, // Array |
vladounet | 0:d38d192c2f5f | 30 | VT_MAP_PTR, // Object |
vladounet | 0:d38d192c2f5f | 31 | VT_CST_NULL, // Null |
vladounet | 0:d38d192c2f5f | 32 | VT_CST_TRUE, // True |
vladounet | 0:d38d192c2f5f | 33 | VT_CST_FALSE // False |
vladounet | 0:d38d192c2f5f | 34 | }; |
vladounet | 0:d38d192c2f5f | 35 | |
vladounet | 0:d38d192c2f5f | 36 | /* |
vladounet | 0:d38d192c2f5f | 37 | * Class to hold a JSON value. A JSON value may be composed of other JSON |
vladounet | 0:d38d192c2f5f | 38 | * values. |
vladounet | 0:d38d192c2f5f | 39 | */ |
vladounet | 0:d38d192c2f5f | 40 | class JsonValue |
vladounet | 0:d38d192c2f5f | 41 | { |
vladounet | 0:d38d192c2f5f | 42 | public: |
vladounet | 0:d38d192c2f5f | 43 | |
vladounet | 0:d38d192c2f5f | 44 | /* |
vladounet | 0:d38d192c2f5f | 45 | * Creates a new string JSON value. The string is copied into the object. |
vladounet | 0:d38d192c2f5f | 46 | * WARNING: a new object is created. The caller is responsible of deleting |
vladounet | 0:d38d192c2f5f | 47 | * it. |
vladounet | 0:d38d192c2f5f | 48 | * buffer: the string to read from. |
vladounet | 0:d38d192c2f5f | 49 | * len: the number of characters to read. |
vladounet | 0:d38d192c2f5f | 50 | */ |
vladounet | 0:d38d192c2f5f | 51 | static JsonValue* createString(const char* buffer, int len); |
vladounet | 0:d38d192c2f5f | 52 | |
vladounet | 0:d38d192c2f5f | 53 | /* Creates a new number JSON value. |
vladounet | 0:d38d192c2f5f | 54 | * WARNING: a new object is created. The caller is responsible of deleting |
vladounet | 0:d38d192c2f5f | 55 | * it. |
vladounet | 0:d38d192c2f5f | 56 | */ |
vladounet | 0:d38d192c2f5f | 57 | static JsonValue* createDouble(double d); |
vladounet | 0:d38d192c2f5f | 58 | |
vladounet | 0:d38d192c2f5f | 59 | /* Creates a new object JSON value. |
vladounet | 0:d38d192c2f5f | 60 | * WARNING: a new object is created. The caller is responsible of deleting |
vladounet | 0:d38d192c2f5f | 61 | * it. |
vladounet | 0:d38d192c2f5f | 62 | */ |
vladounet | 0:d38d192c2f5f | 63 | static JsonValue* createMap(); |
vladounet | 0:d38d192c2f5f | 64 | |
vladounet | 0:d38d192c2f5f | 65 | /* Creates a new array JSON value. |
vladounet | 0:d38d192c2f5f | 66 | * WARNING: a new object is created. The caller is responsible of deleting |
vladounet | 0:d38d192c2f5f | 67 | * it. |
vladounet | 0:d38d192c2f5f | 68 | */ |
vladounet | 0:d38d192c2f5f | 69 | static JsonValue* createVector(); |
vladounet | 0:d38d192c2f5f | 70 | |
vladounet | 0:d38d192c2f5f | 71 | /* Creates a new true or false JSON value, depending on b. |
vladounet | 0:d38d192c2f5f | 72 | * WARNING: a new object is created. The caller is responsible of deleting |
vladounet | 0:d38d192c2f5f | 73 | * it. |
vladounet | 0:d38d192c2f5f | 74 | */ |
vladounet | 0:d38d192c2f5f | 75 | static JsonValue* createBoolean(bool b); |
vladounet | 0:d38d192c2f5f | 76 | |
vladounet | 0:d38d192c2f5f | 77 | /* Creates a new null JSON value. |
vladounet | 0:d38d192c2f5f | 78 | * WARNING: a new object is created. The caller is responsible of deleting |
vladounet | 0:d38d192c2f5f | 79 | * it. |
vladounet | 0:d38d192c2f5f | 80 | */ |
vladounet | 0:d38d192c2f5f | 81 | static JsonValue* createNull(); |
vladounet | 0:d38d192c2f5f | 82 | |
vladounet | 0:d38d192c2f5f | 83 | /* |
vladounet | 0:d38d192c2f5f | 84 | * Destructor. |
vladounet | 0:d38d192c2f5f | 85 | * The destructor also deletes nested JsonValues if any. |
vladounet | 0:d38d192c2f5f | 86 | */ |
vladounet | 0:d38d192c2f5f | 87 | virtual ~JsonValue(); |
vladounet | 0:d38d192c2f5f | 88 | |
vladounet | 0:d38d192c2f5f | 89 | /* |
vladounet | 0:d38d192c2f5f | 90 | * Gets a JSON value given a path. |
vladounet | 0:d38d192c2f5f | 91 | * If the path is NULL or an empty string the method returns this. |
vladounet | 0:d38d192c2f5f | 92 | * If there is an error, the method returns NULL. |
vladounet | 0:d38d192c2f5f | 93 | * The path is composed of strings (object keys) and numbers (array |
vladounet | 0:d38d192c2f5f | 94 | * indices) separated by '/'. |
vladounet | 0:d38d192c2f5f | 95 | * |
vladounet | 0:d38d192c2f5f | 96 | * Example: |
vladounet | 0:d38d192c2f5f | 97 | * JSON: {"xy":34,"ab":[{"r":true},{"s":false}]} |
vladounet | 0:d38d192c2f5f | 98 | * Path: ab/1/s |
vladounet | 0:d38d192c2f5f | 99 | * Returns: a JsonValue representing false. |
vladounet | 0:d38d192c2f5f | 100 | */ |
vladounet | 0:d38d192c2f5f | 101 | JsonValue* get(const char* path); |
vladounet | 0:d38d192c2f5f | 102 | |
vladounet | 0:d38d192c2f5f | 103 | /* |
vladounet | 0:d38d192c2f5f | 104 | * Gets a pointer to a double given a path (see get()). |
vladounet | 0:d38d192c2f5f | 105 | * If there is an error, the method returns NULL. |
vladounet | 0:d38d192c2f5f | 106 | */ |
vladounet | 0:d38d192c2f5f | 107 | const double* getDouble(const char* path); |
vladounet | 0:d38d192c2f5f | 108 | |
vladounet | 0:d38d192c2f5f | 109 | /* |
vladounet | 0:d38d192c2f5f | 110 | * Gets a pointer to a string given a path (see get()). |
vladounet | 0:d38d192c2f5f | 111 | * If there is an error, the method returns NULL. |
vladounet | 0:d38d192c2f5f | 112 | */ |
vladounet | 0:d38d192c2f5f | 113 | const char* getString(const char* path); |
vladounet | 0:d38d192c2f5f | 114 | |
vladounet | 0:d38d192c2f5f | 115 | /* |
vladounet | 0:d38d192c2f5f | 116 | * Gets a pointer to an array given a path (see get()). |
vladounet | 0:d38d192c2f5f | 117 | * If there is an error, the method returns NULL. |
vladounet | 0:d38d192c2f5f | 118 | */ |
vladounet | 0:d38d192c2f5f | 119 | const std::vector<JsonValue*>* getVector(const char* path); |
vladounet | 0:d38d192c2f5f | 120 | |
vladounet | 0:d38d192c2f5f | 121 | /* |
vladounet | 0:d38d192c2f5f | 122 | * Gets a pointer to a map given a path (see get()). |
vladounet | 0:d38d192c2f5f | 123 | * If there is an error, the method returns NULL. |
vladounet | 0:d38d192c2f5f | 124 | */ |
vladounet | 0:d38d192c2f5f | 125 | const std::map<std::string,JsonValue*>* getMap(const char* path); |
vladounet | 0:d38d192c2f5f | 126 | |
vladounet | 0:d38d192c2f5f | 127 | /* |
vladounet | 0:d38d192c2f5f | 128 | * Gets a pointer to a boolean given a path (see get()). |
vladounet | 0:d38d192c2f5f | 129 | * If there is an error, the method returns NULL. |
vladounet | 0:d38d192c2f5f | 130 | */ |
vladounet | 0:d38d192c2f5f | 131 | const bool* getBoolean(const char* path); |
vladounet | 0:d38d192c2f5f | 132 | |
vladounet | 0:d38d192c2f5f | 133 | /* |
vladounet | 0:d38d192c2f5f | 134 | * Determines if the value at the path (see get()) is null. |
vladounet | 0:d38d192c2f5f | 135 | * Return true if and only if the value is explicitely null. |
vladounet | 0:d38d192c2f5f | 136 | */ |
vladounet | 0:d38d192c2f5f | 137 | bool isNull(const char* path); |
vladounet | 0:d38d192c2f5f | 138 | |
vladounet | 0:d38d192c2f5f | 139 | /* |
vladounet | 0:d38d192c2f5f | 140 | * Debug function. |
vladounet | 0:d38d192c2f5f | 141 | */ |
vladounet | 0:d38d192c2f5f | 142 | void print(); |
vladounet | 0:d38d192c2f5f | 143 | |
vladounet | 0:d38d192c2f5f | 144 | friend class JsonParser; |
vladounet | 0:d38d192c2f5f | 145 | |
vladounet | 0:d38d192c2f5f | 146 | private: |
vladounet | 0:d38d192c2f5f | 147 | |
vladounet | 0:d38d192c2f5f | 148 | /* |
vladounet | 0:d38d192c2f5f | 149 | * Constructor that creates a string JSON value. The string is copied into |
vladounet | 0:d38d192c2f5f | 150 | * the object. |
vladounet | 0:d38d192c2f5f | 151 | * buffer: the string to read from. |
vladounet | 0:d38d192c2f5f | 152 | * len: the number of characters to read. |
vladounet | 0:d38d192c2f5f | 153 | */ |
vladounet | 0:d38d192c2f5f | 154 | JsonValue(const char* buffer, int len); |
vladounet | 0:d38d192c2f5f | 155 | |
vladounet | 0:d38d192c2f5f | 156 | /* |
vladounet | 0:d38d192c2f5f | 157 | * Constructor that creates a number JSON value. |
vladounet | 0:d38d192c2f5f | 158 | */ |
vladounet | 0:d38d192c2f5f | 159 | JsonValue(double d); |
vladounet | 0:d38d192c2f5f | 160 | |
vladounet | 0:d38d192c2f5f | 161 | /* |
vladounet | 0:d38d192c2f5f | 162 | * Constructor that creates either a True or a False JSON value. |
vladounet | 0:d38d192c2f5f | 163 | */ |
vladounet | 0:d38d192c2f5f | 164 | JsonValue(bool b); |
vladounet | 0:d38d192c2f5f | 165 | |
vladounet | 0:d38d192c2f5f | 166 | /* |
vladounet | 0:d38d192c2f5f | 167 | * Constructor that creates a JSON value without specifying the type. |
vladounet | 0:d38d192c2f5f | 168 | */ |
vladounet | 0:d38d192c2f5f | 169 | JsonValue(); |
vladounet | 0:d38d192c2f5f | 170 | |
vladounet | 0:d38d192c2f5f | 171 | ValueType type; |
vladounet | 0:d38d192c2f5f | 172 | union { |
vladounet | 0:d38d192c2f5f | 173 | double d; |
vladounet | 0:d38d192c2f5f | 174 | char* s; |
vladounet | 0:d38d192c2f5f | 175 | std::vector<JsonValue*>* vec; |
vladounet | 0:d38d192c2f5f | 176 | std::map<std::string,JsonValue*>* map; |
vladounet | 0:d38d192c2f5f | 177 | } value; |
vladounet | 0:d38d192c2f5f | 178 | |
vladounet | 0:d38d192c2f5f | 179 | }; |
vladounet | 0:d38d192c2f5f | 180 | |
vladounet | 0:d38d192c2f5f | 181 | enum TokenType { |
vladounet | 0:d38d192c2f5f | 182 | TOKEN_EOS, |
vladounet | 0:d38d192c2f5f | 183 | TOKEN_NUMBER, |
vladounet | 0:d38d192c2f5f | 184 | TOKEN_STRING, |
vladounet | 0:d38d192c2f5f | 185 | TOKEN_DELIMITER, |
vladounet | 0:d38d192c2f5f | 186 | TOKEN_TRUE, |
vladounet | 0:d38d192c2f5f | 187 | TOKEN_FALSE, |
vladounet | 0:d38d192c2f5f | 188 | TOKEN_NULL |
vladounet | 0:d38d192c2f5f | 189 | }; |
vladounet | 0:d38d192c2f5f | 190 | |
vladounet | 0:d38d192c2f5f | 191 | /* |
vladounet | 0:d38d192c2f5f | 192 | * Class to parse a JSON string. |
vladounet | 0:d38d192c2f5f | 193 | * |
vladounet | 0:d38d192c2f5f | 194 | * NOTE: The current implementation does only support ASCII encoding. |
vladounet | 0:d38d192c2f5f | 195 | */ |
vladounet | 0:d38d192c2f5f | 196 | class JsonParser |
vladounet | 0:d38d192c2f5f | 197 | { |
vladounet | 0:d38d192c2f5f | 198 | public: |
vladounet | 0:d38d192c2f5f | 199 | |
vladounet | 0:d38d192c2f5f | 200 | /* |
vladounet | 0:d38d192c2f5f | 201 | * Constructor. |
vladounet | 0:d38d192c2f5f | 202 | */ |
vladounet | 0:d38d192c2f5f | 203 | JsonParser(); |
vladounet | 0:d38d192c2f5f | 204 | |
vladounet | 0:d38d192c2f5f | 205 | /* |
vladounet | 0:d38d192c2f5f | 206 | * Destructor. |
vladounet | 0:d38d192c2f5f | 207 | * The destructor also deletes the parsed document (the one you get with |
vladounet | 0:d38d192c2f5f | 208 | * getDocument(). |
vladounet | 0:d38d192c2f5f | 209 | */ |
vladounet | 0:d38d192c2f5f | 210 | virtual ~JsonParser(); |
vladounet | 0:d38d192c2f5f | 211 | |
vladounet | 0:d38d192c2f5f | 212 | /* |
vladounet | 0:d38d192c2f5f | 213 | * Parses the json string. |
vladounet | 0:d38d192c2f5f | 214 | * json: String that contains the json to parse. |
vladounet | 0:d38d192c2f5f | 215 | * Returns 0 on success, or -1 on error. |
vladounet | 0:d38d192c2f5f | 216 | * |
vladounet | 0:d38d192c2f5f | 217 | * NOTE: This method deletes the previously parsed document. |
vladounet | 0:d38d192c2f5f | 218 | */ |
vladounet | 0:d38d192c2f5f | 219 | int parse(const char* json); |
vladounet | 0:d38d192c2f5f | 220 | |
vladounet | 0:d38d192c2f5f | 221 | /* |
vladounet | 0:d38d192c2f5f | 222 | * Returns the parsed document, or NULL if the json is not parsed. |
vladounet | 0:d38d192c2f5f | 223 | */ |
vladounet | 0:d38d192c2f5f | 224 | JsonValue* getDocument(); |
vladounet | 0:d38d192c2f5f | 225 | |
vladounet | 0:d38d192c2f5f | 226 | private: |
vladounet | 0:d38d192c2f5f | 227 | const char* json; |
vladounet | 0:d38d192c2f5f | 228 | int json_len; |
vladounet | 0:d38d192c2f5f | 229 | TokenType ct; |
vladounet | 0:d38d192c2f5f | 230 | int ctPos; |
vladounet | 0:d38d192c2f5f | 231 | int ctLen; |
vladounet | 0:d38d192c2f5f | 232 | double ctNumberVal; |
vladounet | 0:d38d192c2f5f | 233 | JsonValue* pDocument; |
vladounet | 0:d38d192c2f5f | 234 | |
vladounet | 0:d38d192c2f5f | 235 | int goToNextToken(); |
vladounet | 0:d38d192c2f5f | 236 | |
vladounet | 0:d38d192c2f5f | 237 | int parseObject(JsonValue** object); |
vladounet | 0:d38d192c2f5f | 238 | int parseValue(JsonValue** value); |
vladounet | 0:d38d192c2f5f | 239 | int parseArray(JsonValue** array); |
vladounet | 0:d38d192c2f5f | 240 | }; |
vladounet | 0:d38d192c2f5f | 241 | |
vladounet | 0:d38d192c2f5f | 242 | #endif |