Last active
July 24, 2017 07:38
-
-
Save manashmandal/9e29fa1ab2ad94a0f2c5f75153ebdf80 to your computer and use it in GitHub Desktop.
jasmine.c
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include "jsmn.h" | |
/* | |
* A small example of jsmn parsing when JSON structure is known and number of | |
* tokens is predictable. | |
*/ | |
static const char *JSON_STRING = | |
"{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n " | |
"\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}"; | |
static int jsoneq(const char *json, jsmntok_t *tok, const char *s) { | |
if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start && | |
strncmp(json + tok->start, s, tok->end - tok->start) == 0) { | |
return 0; | |
} | |
return -1; | |
} | |
int main() { | |
int i; | |
int r; | |
jsmn_parser p; | |
jsmntok_t t[128]; /* We expect no more than 128 tokens */ | |
jsmn_init(&p); | |
r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), t, sizeof(t)/sizeof(t[0])); | |
if (r < 0) { | |
printf("Failed to parse JSON: %d\n", r); | |
return 1; | |
} | |
/* Assume the top-level element is an object */ | |
if (r < 1 || t[0].type != JSMN_OBJECT) { | |
printf("Object expected\n"); | |
return 1; | |
} | |
/* Loop over all keys of the root object */ | |
for (i = 1; i < r; i++) { | |
if (jsoneq(JSON_STRING, &t[i], "user") == 0) { | |
printf("USER KEY: %.*s",t[i].end - t[i].start ,JSON_STRING + t[i].start); | |
printf("USER KEY"); | |
/* We may use strndup() to fetch string value */ | |
printf("- User: %.*s\n", t[i+1].end-t[i+1].start, | |
JSON_STRING + t[i+1].start); | |
i++; | |
} else if (jsoneq(JSON_STRING, &t[i], "admin") == 0) { | |
/* We may additionally check if the value is either "true" or "false" */ | |
printf("- Admin: %.*s\n", t[i+1].end-t[i+1].start, | |
JSON_STRING + t[i+1].start); | |
i++; | |
} else if (jsoneq(JSON_STRING, &t[i], "uid") == 0) { | |
/* We may want to do strtol() here to get numeric value */ | |
printf("- UID: %.s*\n", t[i+1].end-t[i+1].start, | |
JSON_STRING + t[i+1].start); | |
printf("Waiting for the end\n"); | |
printf("C: %s\n", JSON_STRING + t[i+1].start); | |
i++; | |
} else if (jsoneq(JSON_STRING, &t[i], "groups") == 0) { | |
int j; | |
printf("- Groups:\n"); | |
if (t[i+1].type != JSMN_ARRAY) { | |
continue; /* We expect groups to be an array of strings */ | |
} | |
for (j = 0; j < t[i+1].size; j++) { | |
jsmntok_t *g = &t[i+j+2]; | |
printf(" * %.*s\n", g->end - g->start, JSON_STRING + g->start); | |
printf("END: %d\n", g->end); | |
printf("START: %d\n", g->start); | |
int str_length = g->end - g->start + 1; | |
char strng[str_length + 1]; | |
int y = 0; | |
for (y = 0; y < str_length - 1; y++){ | |
strng[y] = JSON_STRING[g->start + y]; | |
} | |
strng[str_length-1] = '\0'; | |
printf("COPIED STRING: %s\n", strng); | |
// printf("STRING: %s"); | |
// printf("HELLO TOK\n"); | |
} | |
i += t[i+1].size + 1; | |
} else { | |
printf("Unexpected key: %.*s\n", t[i].end-t[i].start, | |
JSON_STRING + t[i].start); | |
} | |
} | |
printf ("Width trick: %*d \n", 5, 10); | |
return EXIT_SUCCESS; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include "jsmn.h" | |
/* | |
* A small example of jsmn parsing when JSON structure is known and number of | |
* tokens is predictable. | |
*/ | |
//static const char *JSON_STRING = | |
// "{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n " | |
// "\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}"; | |
static int jsoneq(const char *json, jsmntok_t *tok, const char *s) { | |
if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start && | |
strncmp(json + tok->start, s, tok->end - tok->start) == 0) { | |
return 0; | |
} | |
return -1; | |
} | |
int main() { | |
char JSON_STRING[1024]; | |
printf("READING THE FILE\n"); | |
FILE *f; | |
char c; | |
f=fopen("/home/manash/Jsmn/JSON_STRING.json","rt"); | |
int index = 0; | |
while((c=fgetc(f))!=EOF){ | |
JSON_STRING[index] = c; | |
// printf("%c",c); | |
index++; | |
} | |
JSON_STRING[index] = '\0'; | |
fclose(f); | |
printf("The buffer itself\n"); | |
printf("%s", JSON_STRING); | |
int i; | |
int r; | |
jsmn_parser p; | |
jsmntok_t t[128]; /* We expect no more than 128 tokens */ | |
jsmn_init(&p); | |
r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), t, sizeof(t)/sizeof(t[0])); | |
if (r < 0) { | |
printf("Failed to parse JSON: %d\n", r); | |
return 1; | |
} | |
/* Assume the top-level element is an object */ | |
if (r < 1 || t[0].type != JSMN_OBJECT) { | |
printf("Object expected\n"); | |
return 1; | |
} | |
/* Loop over all keys of the root object */ | |
for (i = 1; i < r; i++) { | |
if (jsoneq(JSON_STRING, &t[i], "user") == 0) { | |
printf("USER KEY: %.*s",t[i].end - t[i].start ,JSON_STRING + t[i].start); | |
printf("USER KEY"); | |
/* We may use strndup() to fetch string value */ | |
printf("- User: %.*s\n", t[i+1].end-t[i+1].start, | |
JSON_STRING + t[i+1].start); | |
i++; | |
} else if (jsoneq(JSON_STRING, &t[i], "admin") == 0) { | |
/* We may additionally check if the value is either "true" or "false" */ | |
printf("- Admin: %.*s\n", t[i+1].end-t[i+1].start, | |
JSON_STRING + t[i+1].start); | |
i++; | |
} else if (jsoneq(JSON_STRING, &t[i], "uid") == 0) { | |
/* We may want to do strtol() here to get numeric value */ | |
printf("- UID: %.s*\n", t[i+1].end-t[i+1].start, | |
JSON_STRING + t[i+1].start); | |
printf("Waiting for the end\n"); | |
printf("C: %s\n", JSON_STRING + t[i+1].start); | |
i++; | |
} else if (jsoneq(JSON_STRING, &t[i], "groups") == 0) { | |
int j; | |
printf("- Groups:\n"); | |
if (t[i+1].type != JSMN_ARRAY) { | |
continue; /* We expect groups to be an array of strings */ | |
} | |
for (j = 0; j < t[i+1].size; j++) { | |
jsmntok_t *g = &t[i+j+2]; | |
printf(" * %.*s\n", g->end - g->start, JSON_STRING + g->start); | |
printf("END: %d\n", g->end); | |
printf("START: %d\n", g->start); | |
int str_length = g->end - g->start + 1; | |
char strng[str_length + 1]; | |
int y = 0; | |
for (y = 0; y < str_length - 1; y++){ | |
strng[y] = JSON_STRING[g->start + y]; | |
} | |
strng[str_length-1] = '\0'; | |
printf("COPIED STRING: %s\n", strng); | |
// printf("STRING: %s"); | |
// printf("HELLO TOK\n"); | |
} | |
i += t[i+1].size + 1; | |
} else { | |
printf("Unexpected key: %.*s\n", t[i].end-t[i].start, | |
JSON_STRING + t[i].start); | |
} | |
} | |
printf ("Width trick: %*d \n", 5, 10); | |
return EXIT_SUCCESS; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment