Example to use JSMN (Jasmine JSON Library)
Fork of _library_jsmn by
main.cpp@0:28f07b17e084, 2014-06-11 (annotated)
- Committer:
- yoonghm
- Date:
- Wed Jun 11 03:24:52 2014 +0000
- Revision:
- 0:28f07b17e084
Example to use jsmn (Jasmine JSON Library)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yoonghm | 0:28f07b17e084 | 1 | #include <ctype.h> |
yoonghm | 0:28f07b17e084 | 2 | |
yoonghm | 0:28f07b17e084 | 3 | #include "mbed.h" |
yoonghm | 0:28f07b17e084 | 4 | |
yoonghm | 0:28f07b17e084 | 5 | #include "jsmn.h" |
yoonghm | 0:28f07b17e084 | 6 | |
yoonghm | 0:28f07b17e084 | 7 | #define MAXTOKEN 64 |
yoonghm | 0:28f07b17e084 | 8 | |
yoonghm | 0:28f07b17e084 | 9 | const char *jsmn_type_str[] = { |
yoonghm | 0:28f07b17e084 | 10 | "PRIMITIVE", |
yoonghm | 0:28f07b17e084 | 11 | "OBJECT", |
yoonghm | 0:28f07b17e084 | 12 | "ARRAY", |
yoonghm | 0:28f07b17e084 | 13 | "STRING" |
yoonghm | 0:28f07b17e084 | 14 | }; |
yoonghm | 0:28f07b17e084 | 15 | |
yoonghm | 0:28f07b17e084 | 16 | |
yoonghm | 0:28f07b17e084 | 17 | int main() |
yoonghm | 0:28f07b17e084 | 18 | { |
yoonghm | 0:28f07b17e084 | 19 | const char *js; // Pointer to json string |
yoonghm | 0:28f07b17e084 | 20 | int r; // Number of token parsed |
yoonghm | 0:28f07b17e084 | 21 | jsmn_parser p; // jsmn parser |
yoonghm | 0:28f07b17e084 | 22 | jsmntok_t t[MAXTOKEN]; // Parsed token |
yoonghm | 0:28f07b17e084 | 23 | |
yoonghm | 0:28f07b17e084 | 24 | // JSON may contain multibyte characters or encoded unicode in |
yoonghm | 0:28f07b17e084 | 25 | // \uXXXX format. |
yoonghm | 0:28f07b17e084 | 26 | // mbed compiler may complain "invalid multibyte character sequence". |
yoonghm | 0:28f07b17e084 | 27 | js = |
yoonghm | 0:28f07b17e084 | 28 | "{" |
yoonghm | 0:28f07b17e084 | 29 | " \"menu\":" |
yoonghm | 0:28f07b17e084 | 30 | " {" |
yoonghm | 0:28f07b17e084 | 31 | " \"id\": 1234," |
yoonghm | 0:28f07b17e084 | 32 | " \"group\": \"File\"," |
yoonghm | 0:28f07b17e084 | 33 | " \"popup\":" |
yoonghm | 0:28f07b17e084 | 34 | " {" |
yoonghm | 0:28f07b17e084 | 35 | " \"menuitem\":" |
yoonghm | 0:28f07b17e084 | 36 | " [" |
yoonghm | 0:28f07b17e084 | 37 | " {\"value\": true, \"onclick\" : \"বিশাল\"}," |
yoonghm | 0:28f07b17e084 | 38 | " {\"value\": false, 0x1328 : \"groß\"}," |
yoonghm | 0:28f07b17e084 | 39 | " {\"value\": null, \"15\u00f8C\": \"3\u0111\"}," |
yoonghm | 0:28f07b17e084 | 40 | " {\"value\": \"測試\", -12.34 : 99}" |
yoonghm | 0:28f07b17e084 | 41 | " ]" |
yoonghm | 0:28f07b17e084 | 42 | " }" |
yoonghm | 0:28f07b17e084 | 43 | " }" |
yoonghm | 0:28f07b17e084 | 44 | "}"; |
yoonghm | 0:28f07b17e084 | 45 | |
yoonghm | 0:28f07b17e084 | 46 | jsmn_init(&p); |
yoonghm | 0:28f07b17e084 | 47 | r = jsmn_parse(&p, js, strlen(js), t, MAXTOKEN); |
yoonghm | 0:28f07b17e084 | 48 | |
yoonghm | 0:28f07b17e084 | 49 | printf("Parsed %d tokens\n", r); |
yoonghm | 0:28f07b17e084 | 50 | |
yoonghm | 0:28f07b17e084 | 51 | printf(" TYPE START END SIZE PAR\n"); |
yoonghm | 0:28f07b17e084 | 52 | printf(" ---------- ----- ---- ---- ---\n"); |
yoonghm | 0:28f07b17e084 | 53 | |
yoonghm | 0:28f07b17e084 | 54 | char ch; |
yoonghm | 0:28f07b17e084 | 55 | jsmntok_t at; // A token for general use |
yoonghm | 0:28f07b17e084 | 56 | for (int i = 0; i < r; i++) |
yoonghm | 0:28f07b17e084 | 57 | { |
yoonghm | 0:28f07b17e084 | 58 | at = t[i]; |
yoonghm | 0:28f07b17e084 | 59 | printf("Token %2d = %-10.10s (%4d - %4d, %3d, %2d) --> ", |
yoonghm | 0:28f07b17e084 | 60 | i, jsmn_type_str[at.type], |
yoonghm | 0:28f07b17e084 | 61 | at.start, at.end, |
yoonghm | 0:28f07b17e084 | 62 | at.size, at.parent); |
yoonghm | 0:28f07b17e084 | 63 | |
yoonghm | 0:28f07b17e084 | 64 | switch (at.type) |
yoonghm | 0:28f07b17e084 | 65 | { |
yoonghm | 0:28f07b17e084 | 66 | case JSMN_STRING: |
yoonghm | 0:28f07b17e084 | 67 | printf("%-10.*s\n", at.end - at.start + 2, js + at.start - 1); |
yoonghm | 0:28f07b17e084 | 68 | break; |
yoonghm | 0:28f07b17e084 | 69 | |
yoonghm | 0:28f07b17e084 | 70 | case JSMN_PRIMITIVE: |
yoonghm | 0:28f07b17e084 | 71 | ch = *(js + at.start); |
yoonghm | 0:28f07b17e084 | 72 | |
yoonghm | 0:28f07b17e084 | 73 | if (isdigit(ch) || ch == '-') |
yoonghm | 0:28f07b17e084 | 74 | printf("%-10.*s\n", at.end - at.start, js + at.start); |
yoonghm | 0:28f07b17e084 | 75 | else if (tolower(ch) == 'n') |
yoonghm | 0:28f07b17e084 | 76 | printf("null\n"); |
yoonghm | 0:28f07b17e084 | 77 | else if (tolower(ch) == 't') |
yoonghm | 0:28f07b17e084 | 78 | printf("true\n"); |
yoonghm | 0:28f07b17e084 | 79 | else if (tolower(ch) == 'f') |
yoonghm | 0:28f07b17e084 | 80 | printf("false\n"); |
yoonghm | 0:28f07b17e084 | 81 | break; |
yoonghm | 0:28f07b17e084 | 82 | |
yoonghm | 0:28f07b17e084 | 83 | default: |
yoonghm | 0:28f07b17e084 | 84 | printf("\n"); |
yoonghm | 0:28f07b17e084 | 85 | break; |
yoonghm | 0:28f07b17e084 | 86 | } |
yoonghm | 0:28f07b17e084 | 87 | } |
yoonghm | 0:28f07b17e084 | 88 | |
yoonghm | 0:28f07b17e084 | 89 | while (1) |
yoonghm | 0:28f07b17e084 | 90 | ; |
yoonghm | 0:28f07b17e084 | 91 | } |