7 * A small example of jsmn parsing when JSON structure is known and number of
8 * tokens is predictable.
12 "{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n "
13 "\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}";*/
15 long int filesize(FILE *fp)
\r
17 long int save_pos, size_of_file;
\r
19 save_pos = ftell(fp);
\r
20 fseek(fp, 0L, SEEK_END);
\r
21 size_of_file = ftell(fp);
\r
22 fseek(fp, save_pos, SEEK_SET);
\r
23 return(size_of_file);
\r
26 static int jsoneq(const char *json, jsmntok_t *tok, const char *s) {
27 if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start &&
28 strncmp(json + tok->start, s, tok->end - tok->start) == 0) {
40 jsmntok_t t[2048]; /* We expect no more than 128 tokens */
41 FILE *fh = fopen("../../../../data/test.map", "r");
42 char *json_string = malloc(filesize(fh));
43 //memset(json_string, 0, sizeof(*json_string));
47 z = fread(json_string, 1, filesize(fh), fh);
48 fclose(fh); fh = NULL;
49 printf("[[%d]]\n", z);
50 json_string[z] = '\0';
51 // we can now close the file
52 //printf("]%s[\n", json_s);
54 //printf("[[%s]]\n", json_string);
57 r = jsmn_parse(&p, json_string, strlen(json_string), t, sizeof(t)/sizeof(t[0]));
58 printf("[\n%s\n]", json_string);
60 printf("Failed to parse JSON: %d\n", r);
64 /* Assume the top-level element is an object */
65 if (r < 1 || t[0].type != JSMN_OBJECT) {
66 printf("Object expected\n");
70 /* Loop over all keys of the root object */
71 for (i = 1; i < r; i++) {
72 if (jsoneq(json_string, &t[i], "image") == 0) {
73 /* We may use strndup() to fetch string value */
74 printf("- image: %.*s\n", t[i+1].end-t[i+1].start,
75 json_string + t[i+1].start);
77 } else if (jsoneq(json_string, &t[i], "admin") == 0) {
78 /* We may additionally check if the value is either "true" or "false" */
79 printf("- Admin: %.*s\n", t[i+1].end-t[i+1].start,
80 json_string + t[i+1].start);
82 } else if (jsoneq(json_string, &t[i], "uid") == 0) {
83 /* We may want to do strtol() here to get numeric value */
84 printf("- UID: %.*s\n", t[i+1].end-t[i+1].start,
85 json_string + t[i+1].start);
87 } else if (jsoneq(json_string, &t[i], "tilesets") == 0) {
89 printf("- tilesets:\n");
90 if (t[i+1].type != JSMN_ARRAY) {
91 continue; /* We expect groups to be an array of strings */
93 for (j = 0; j < t[i+1].size; j++) {
94 jsmntok_t *g = &t[i+j+2];
95 printf(" * %.*s\n", g->end - g->start, json_string + g->start);
99 printf("Unexpected key: %.*s\n", t[i].end-t[i].start,
100 json_string + t[i].start);
106 if (fh != NULL) fclose(fh);