Linija pogona

Dependents:   SERIALPARSER_copy

Committer:
mario_meh
Date:
Wed Nov 22 08:56:09 2017 +0000
Revision:
0:071c54c546de
Linija pogona

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mario_meh 0:071c54c546de 1 /* C-based low-memory footprint JSON parser for mbed
mario_meh 0:071c54c546de 2 * Based on Serge Zaitsev's JSMN https://bitbucket.org/zserge/jsmn/wiki/Home
mario_meh 0:071c54c546de 3 * JSMN is distributed under MIT license.
mario_meh 0:071c54c546de 4 *
mario_meh 0:071c54c546de 5 * Copyright (c) 2010 Serge A. Zaitsev
mario_meh 0:071c54c546de 6 * Copyright (c) 2014 YoongHM
mario_meh 0:071c54c546de 7 *
mario_meh 0:071c54c546de 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
mario_meh 0:071c54c546de 9 * of this software and associated documentation files (the "Software"), to deal
mario_meh 0:071c54c546de 10 * in the Software without restriction, including without limitation the rights
mario_meh 0:071c54c546de 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
mario_meh 0:071c54c546de 12 * copies of the Software, and to permit persons to whom the Software is
mario_meh 0:071c54c546de 13 * furnished to do so, subject to the following conditions:
mario_meh 0:071c54c546de 14 *
mario_meh 0:071c54c546de 15 * The above copyright notice and this permission notice shall be included in
mario_meh 0:071c54c546de 16 * all copies or substantial portions of the Software.
mario_meh 0:071c54c546de 17 *
mario_meh 0:071c54c546de 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
mario_meh 0:071c54c546de 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
mario_meh 0:071c54c546de 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
mario_meh 0:071c54c546de 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
mario_meh 0:071c54c546de 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mario_meh 0:071c54c546de 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
mario_meh 0:071c54c546de 24 * THE SOFTWARE.
mario_meh 0:071c54c546de 25 */
mario_meh 0:071c54c546de 26
mario_meh 0:071c54c546de 27 #ifndef MBED_JSMN_H
mario_meh 0:071c54c546de 28 #define MBED_JSMN_H
mario_meh 0:071c54c546de 29
mario_meh 0:071c54c546de 30 /**
mario_meh 0:071c54c546de 31 * A c-based low-memory low-memory footprint JSON parser for mbed.
mario_meh 0:071c54c546de 32 *
mario_meh 0:071c54c546de 33 * The code is based on Serge Zaitsev's JSMN on
mario_meh 0:071c54c546de 34 * https://bitbucket.org/zserge/jsmn/wiki/Home
mario_meh 0:071c54c546de 35 *
mario_meh 0:071c54c546de 36 * @code
mario_meh 0:071c54c546de 37 *#include "mbed.h"
mario_meh 0:071c54c546de 38 *
mario_meh 0:071c54c546de 39 *#include "jsmn.h"
mario_meh 0:071c54c546de 40 *
mario_meh 0:071c54c546de 41 *#define MAXTOKEN 64
mario_meh 0:071c54c546de 42 *
mario_meh 0:071c54c546de 43 *const char *jsmn_type_str[] = {
mario_meh 0:071c54c546de 44 * "PRIMITIVE",
mario_meh 0:071c54c546de 45 * "OBJECT",
mario_meh 0:071c54c546de 46 * "ARRAY",
mario_meh 0:071c54c546de 47 * "STRING"
mario_meh 0:071c54c546de 48 *};
mario_meh 0:071c54c546de 49 *
mario_meh 0:071c54c546de 50 *int main()
mario_meh 0:071c54c546de 51 *{
mario_meh 0:071c54c546de 52 * const char *js; // Pointer to json string
mario_meh 0:071c54c546de 53 * int r; // Number of token parsed
mario_meh 0:071c54c546de 54 * jsmn_parser p; // jsmn parser
mario_meh 0:071c54c546de 55 * jsmntok_t t[MAXTOKEN]; // Parsed token
mario_meh 0:071c54c546de 56 *
mario_meh 0:071c54c546de 57 * // JSON may contain multibyte characters or encoded unicode in
mario_meh 0:071c54c546de 58 * // \uXXXX format.
mario_meh 0:071c54c546de 59 * // mbed compiler may complain "invalid multibyte characters ...".
mario_meh 0:071c54c546de 60 * js =
mario_meh 0:071c54c546de 61 *"{"
mario_meh 0:071c54c546de 62 *" \"menu\":"
mario_meh 0:071c54c546de 63 *" {"
mario_meh 0:071c54c546de 64 *" \"id\": 1234,"
mario_meh 0:071c54c546de 65 *" \"group\": \"File\","
mario_meh 0:071c54c546de 66 *" \"popup\":"
mario_meh 0:071c54c546de 67 *" {"
mario_meh 0:071c54c546de 68 *" \"menuitem\":"
mario_meh 0:071c54c546de 69 *" ["
mario_meh 0:071c54c546de 70 *" {\"value\": true, \"onclick\" : \"বিশাল\"},"
mario_meh 0:071c54c546de 71 *" {\"value\": false, 0x1328 : \"groß\"},"
mario_meh 0:071c54c546de 72 *" {\"value\": null, \"15\u00f8C\": \"3\u0111\"},"
mario_meh 0:071c54c546de 73 *" {\"value\": \"測試\", -12.34 : 99}"
mario_meh 0:071c54c546de 74 *" ]"
mario_meh 0:071c54c546de 75 *" }"
mario_meh 0:071c54c546de 76 *" }"
mario_meh 0:071c54c546de 77 *"}";
mario_meh 0:071c54c546de 78 *
mario_meh 0:071c54c546de 79 * jsmn_init(&p);
mario_meh 0:071c54c546de 80 * r = jsmn_parse(&p, js, strlen(js), t, MAXTOKEN);
mario_meh 0:071c54c546de 81 *
mario_meh 0:071c54c546de 82 * printf("Parsed %d tokens\n", r);
mario_meh 0:071c54c546de 83 *
mario_meh 0:071c54c546de 84 * printf(" TYPE START END SIZE PAR\n");
mario_meh 0:071c54c546de 85 * printf(" ---------- ----- ---- ---- ---\n");
mario_meh 0:071c54c546de 86 *
mario_meh 0:071c54c546de 87 * char ch;
mario_meh 0:071c54c546de 88 * jsmntok_t at; // A token for general use
mario_meh 0:071c54c546de 89 * for (int i = 0; i < r; i++)
mario_meh 0:071c54c546de 90 * {
mario_meh 0:071c54c546de 91 * at = t[i];
mario_meh 0:071c54c546de 92 * printf("Token %2d = %-10.10s (%4d - %4d, %3d, %2d) --> ",
mario_meh 0:071c54c546de 93 * i, jsmn_type_str[at.type],
mario_meh 0:071c54c546de 94 * at.start, at.end,
mario_meh 0:071c54c546de 95 * at.size, at.parent);
mario_meh 0:071c54c546de 96 *
mario_meh 0:071c54c546de 97 * switch (at.type)
mario_meh 0:071c54c546de 98 * {
mario_meh 0:071c54c546de 99 * case JSMN_STRING:
mario_meh 0:071c54c546de 100 * printf("%-10.*s\n", at.end - at.start + 2, js + at.start - 1);
mario_meh 0:071c54c546de 101 * break;
mario_meh 0:071c54c546de 102 *
mario_meh 0:071c54c546de 103 * case JSMN_PRIMITIVE:
mario_meh 0:071c54c546de 104 * ch = *(js + at.start);
mario_meh 0:071c54c546de 105 *
mario_meh 0:071c54c546de 106 * if (isdigit(ch) || ch == '-')
mario_meh 0:071c54c546de 107 * printf("%-10.*s\n", at.end - at.start, js + at.start);
mario_meh 0:071c54c546de 108 * else if (tolower(ch) == 'n')
mario_meh 0:071c54c546de 109 * printf("null\n");
mario_meh 0:071c54c546de 110 * else if (tolower(ch) == 't')
mario_meh 0:071c54c546de 111 * printf("true\n");
mario_meh 0:071c54c546de 112 * else if (tolower(ch) == 'f')
mario_meh 0:071c54c546de 113 * printf("false\n");
mario_meh 0:071c54c546de 114 * break;
mario_meh 0:071c54c546de 115 *
mario_meh 0:071c54c546de 116 * default:
mario_meh 0:071c54c546de 117 * printf("\n");
mario_meh 0:071c54c546de 118 * break;
mario_meh 0:071c54c546de 119 * }
mario_meh 0:071c54c546de 120 * }
mario_meh 0:071c54c546de 121 *
mario_meh 0:071c54c546de 122 * while (1)
mario_meh 0:071c54c546de 123 * ;
mario_meh 0:071c54c546de 124 *}
mario_meh 0:071c54c546de 125 * @endcode
mario_meh 0:071c54c546de 126 */
mario_meh 0:071c54c546de 127
mario_meh 0:071c54c546de 128 /** jsmntype_t - JSON type recongized by JSMN.
mario_meh 0:071c54c546de 129 * There are
mario_meh 0:071c54c546de 130 * - Primitive: number, boolean (true/false) or null
mario_meh 0:071c54c546de 131 * - Object
mario_meh 0:071c54c546de 132 * - Array
mario_meh 0:071c54c546de 133 * - String
mario_meh 0:071c54c546de 134 */
mario_meh 0:071c54c546de 135 typedef enum {
mario_meh 0:071c54c546de 136 JSMN_PRIMITIVE = 0,
mario_meh 0:071c54c546de 137 JSMN_OBJECT = 1,
mario_meh 0:071c54c546de 138 JSMN_ARRAY = 2,
mario_meh 0:071c54c546de 139 JSMN_STRING = 3,
mario_meh 0:071c54c546de 140 JSMN_INVALID = 4
mario_meh 0:071c54c546de 141 } jsmntype_t;
mario_meh 0:071c54c546de 142
mario_meh 0:071c54c546de 143
mario_meh 0:071c54c546de 144 /** Error message return by JSMN API
mario_meh 0:071c54c546de 145 *
mario_meh 0:071c54c546de 146 */
mario_meh 0:071c54c546de 147 #define JSMN_ERR_OKAY 0 /* No problem */
mario_meh 0:071c54c546de 148 #define JSMN_ERR_NOMEM -1 /* Not enough tokens were provided */
mario_meh 0:071c54c546de 149 #define JSMN_ERR_INVAL -2 /* Invalid character inside JSON string */
mario_meh 0:071c54c546de 150 #define JSMN_ERR_PART -3 /* Incomplete JSON packet */
mario_meh 0:071c54c546de 151
mario_meh 0:071c54c546de 152
mario_meh 0:071c54c546de 153 /** jsmntok_t - JSON token structure.
mario_meh 0:071c54c546de 154 *
mario_meh 0:071c54c546de 155 * It is a c structure that contained parsed JSON token.
mario_meh 0:071c54c546de 156 *
mario_meh 0:071c54c546de 157 * @param type type (primitive, object, array, string)
mario_meh 0:071c54c546de 158 * @param start start position in JSON data string, excl " if is a string
mario_meh 0:071c54c546de 159 * @param end end position in JSON data string, incl " if is a string
mario_meh 0:071c54c546de 160 * @param size number of token directly under it
mario_meh 0:071c54c546de 161 * @param parent link to its direct parent token number
mario_meh 0:071c54c546de 162 */
mario_meh 0:071c54c546de 163 typedef struct {
mario_meh 0:071c54c546de 164 jsmntype_t type;
mario_meh 0:071c54c546de 165 int start; /* Token's start pos;excl " if is a str */
mario_meh 0:071c54c546de 166 int end; /* Token's last pos;incl " if is a str */
mario_meh 0:071c54c546de 167 int size; /* Number of token directly under it */
mario_meh 0:071c54c546de 168 int parent; /* Nth-token which is its direct parent */
mario_meh 0:071c54c546de 169 } jsmntok_t;
mario_meh 0:071c54c546de 170
mario_meh 0:071c54c546de 171
mario_meh 0:071c54c546de 172 /** JSON parser - JSON parser structure.
mario_meh 0:071c54c546de 173 *
mario_meh 0:071c54c546de 174 * Contains an array of token blocks available. Also stores
mario_meh 0:071c54c546de 175 * the string being parsed now and current position in that string
mario_meh 0:071c54c546de 176 */
mario_meh 0:071c54c546de 177 typedef struct {
mario_meh 0:071c54c546de 178 unsigned int pos; /* offset in the JSON string */
mario_meh 0:071c54c546de 179 unsigned int toknext; /* next token to allocate */
mario_meh 0:071c54c546de 180 int toksuper; /* superior token node, (parent or array)*/
mario_meh 0:071c54c546de 181 } jsmn_parser;
mario_meh 0:071c54c546de 182
mario_meh 0:071c54c546de 183
mario_meh 0:071c54c546de 184 /** Initialize jsmn_parser structure for a new JSON parsing
mario_meh 0:071c54c546de 185 *
mario_meh 0:071c54c546de 186 * @param *parser jsmn_parser structure
mario_meh 0:071c54c546de 187 */
mario_meh 0:071c54c546de 188 void
mario_meh 0:071c54c546de 189 jsmn_init
mario_meh 0:071c54c546de 190 (jsmn_parser *parser
mario_meh 0:071c54c546de 191 );
mario_meh 0:071c54c546de 192
mario_meh 0:071c54c546de 193 /** Parse a given JSON data string into array of jsmntok_t tokens.
mario_meh 0:071c54c546de 194 *
mario_meh 0:071c54c546de 195 * @param *parser jsmn_parser structure
mario_meh 0:071c54c546de 196 * @param *js JSON data string
mario_meh 0:071c54c546de 197 * @param len string length of *js
mario_meh 0:071c54c546de 198 * @param *tokens tokens to hold the parsed data
mario_meh 0:071c54c546de 199 */
mario_meh 0:071c54c546de 200 int
mario_meh 0:071c54c546de 201 jsmn_parse
mario_meh 0:071c54c546de 202 (jsmn_parser *parser
mario_meh 0:071c54c546de 203 ,const char *js
mario_meh 0:071c54c546de 204 ,size_t len
mario_meh 0:071c54c546de 205 ,jsmntok_t *tokens
mario_meh 0:071c54c546de 206 ,unsigned int num_tokens
mario_meh 0:071c54c546de 207 );
mario_meh 0:071c54c546de 208
mario_meh 0:071c54c546de 209
mario_meh 0:071c54c546de 210 #endif // JSMN_H