-
-
Save alan-mushi/19546a0e2c6bd4e059fd to your computer and use it in GitHub Desktop.
/* | |
* A simple example of json string parsing with json-c. | |
* | |
* clang -Wall -g -I/usr/include/json-c/ -o json_parser json_parser.c -ljson-c | |
*/ | |
#include <json.h> | |
#include <stdio.h> | |
int main() { | |
struct json_object *jobj; | |
char *str = "{ \"msg-type\": [ \"0xdeadbeef\", \"irc log\" ], \ | |
\"msg-from\": { \"class\": \"soldier\", \"name\": \"Wixilav\" }, \ | |
\"msg-to\": { \"class\": \"supreme-commander\", \"name\": \"[Redacted]\" }, \ | |
\"msg-log\": [ \ | |
\"soldier: Boss there is a slight problem with the piece offering to humans\", \ | |
\"supreme-commander: Explain yourself soldier!\", \ | |
\"soldier: Well they don't seem to move anymore...\", \ | |
\"supreme-commander: Oh snap, I came here to see them twerk!\" \ | |
] \ | |
}"; | |
printf("str:\n---\n%s\n---\n\n", str); | |
jobj = json_tokener_parse(str); | |
printf("jobj from str:\n---\n%s\n---\n", json_object_to_json_string_ext(jobj, JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY)); | |
return 0; | |
} |
/* | |
* Various outputs for flag of json_object_to_json_string_ext(). | |
* | |
* clang -Wall -I/usr/include/json-c/ -o json_print json_print.c -ljson-c | |
*/ | |
#include <json.h> | |
#include <stdio.h> | |
int main() { | |
struct json_object *jobj; | |
const char *question = "Mum, clouds hide alien spaceships don't they ?"; | |
const char *answer = "Of course not! (\"sigh\")"; | |
int i; | |
struct { | |
int flag; | |
const char *flag_str; | |
} json_flags[] = { | |
{ JSON_C_TO_STRING_PLAIN, "JSON_C_TO_STRING_PLAIN" }, | |
{ JSON_C_TO_STRING_SPACED, "JSON_C_TO_STRING_SPACED" }, | |
{ JSON_C_TO_STRING_PRETTY, "JSON_C_TO_STRING_PRETTY" }, | |
{ JSON_C_TO_STRING_NOZERO, "JSON_C_TO_STRING_NOZERO" }, | |
{ JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY, "JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY" }, | |
{ -1, NULL } | |
}; // Create an anonymous struct, instanciate an array and fill it | |
printf("Using printf(): \"%s\", \"%s\"\n\n", question, answer); | |
printf("Using json_object_to_json_string_ext():\n"); | |
/* | |
* The following create an object and add the question and answer to it. | |
*/ | |
jobj = json_object_new_object(); | |
json_object_object_add(jobj, "question", json_object_new_string(question)); | |
json_object_object_add(jobj, "answer", json_object_new_string(answer)); | |
for (i = 0; json_flags[i].flag_str != NULL; i++) { | |
printf("\nFlag %s:\n---\n", json_flags[i].flag_str); | |
printf("%s\n---\n", json_object_to_json_string_ext(jobj, json_flags[i].flag)); | |
} | |
json_object_put(jobj); // Delete the json object | |
return 0; | |
} |
/* | |
* Reference counting example. The idea is to make a json_object res composed from | |
* parts of obj1 and obj2. | |
* | |
* clang -Wall -g -I/usr/include/json-c/ -o json_refcount json_refcount.c -ljson-c | |
*/ | |
#include <json.h> | |
#include <stdio.h> | |
/* | |
* Just a utility function. | |
*/ | |
void print_json_object(struct json_object *jobj, const char *msg) { | |
printf("\n%s: \n", msg); | |
printf("---\n%s\n---\n", json_object_to_json_string(jobj)); | |
} | |
/* | |
* In real life the operations done here are way more complicated, but it's | |
* only an example. | |
*/ | |
struct json_object * find_something(struct json_object *jobj, const char *key) { | |
struct json_object *tmp; | |
json_object_object_get_ex(jobj, key, &tmp); | |
return tmp; | |
} | |
/* | |
* Swap the first and second elements of the array received. | |
* Again, more complicated in real life... | |
*/ | |
void glitch_in_the_matrix(struct json_object *jobj) { | |
struct json_object *pos1, *pos2; | |
print_json_object(jobj, "Before the glitch in the matrix"); | |
pos1 = json_object_array_get_idx(jobj, 0); | |
pos2 = json_object_array_get_idx(jobj, 1); | |
// json_object_array_put_idx decrement the refcount if you replace an | |
// element, but we don't whant that. | |
json_object_array_put_idx(jobj, 0, json_object_get(pos2)); | |
json_object_array_put_idx(jobj, 1, json_object_get(pos1)); | |
print_json_object(jobj, "After the glitch in the matrix"); | |
} | |
int main() { | |
struct json_object *obj1, *obj2, *res, *sub_obj1, *sub_obj2, *tmp; | |
// Creation and print of obj1 and obj2 | |
obj1 = json_object_new_object(); | |
obj2 = json_object_new_object(); | |
json_object_object_add(obj1, KEY1, json_object_new_int(1234)); | |
json_object_object_add(obj2, KEY2, json_object_new_int(4321)); | |
print_json_object(obj1, "obj1 in plaintext"); | |
print_json_object(obj2, "obj2 in plaintext"); | |
// Extraction of the interesting parts of obj1 and obj2 | |
sub_obj1 = find_something(obj1, "peace-code"); | |
sub_obj2 = find_something(obj2, "death-ray-code"); | |
res = json_object_new_array(); | |
// We are going to use those in res so we need to increment the | |
// refcount | |
json_object_array_add(res, json_object_get(sub_obj1)); | |
json_object_array_add(res, json_object_get(sub_obj2)); | |
glitch_in_the_matrix(res); | |
tmp = json_object_array_get_idx(res, 0); | |
printf("\n[>] Unlocking peace with code at index 0 of res: %d\n", json_object_get_int(tmp)); | |
// We can safely put all of these objects | |
json_object_put(obj1); | |
json_object_put(obj2); | |
json_object_put(res); | |
return 0; | |
} |
/* | |
* Exploring the types of json-c. | |
* | |
* clang -Wall -I/usr/include/json-c/ -o json_types json_types.c -ljson-c | |
*/ | |
#include <json.h> | |
#include <stdio.h> | |
int main() { | |
struct json_object *array, *object, *tmp, *secu_code; | |
char *val_type_str, *str; | |
int val_type, i; | |
array = json_object_new_array(); | |
object = json_object_new_object(); | |
// Fill the array | |
tmp = json_object_new_int(12345); | |
json_object_array_add(array, tmp); | |
tmp = json_object_new_boolean(TRUE); | |
json_object_array_put_idx(array, 1, tmp); | |
// Fill the object | |
tmp = json_object_new_string("We have been made!"); | |
json_object_object_add(object, "message", tmp); | |
json_object_object_add(object, "security-code", array); | |
array = tmp = NULL; // "Nothing in the sleeves" | |
str = NULL; | |
// key and val don't exist outside of this bloc | |
json_object_object_foreach(object, key, val) { | |
printf("key: \"%s\", type of val: ", key); | |
val_type = json_object_get_type(val); | |
switch (val_type) { | |
case json_type_null: | |
val_type_str = "val is NULL"; | |
break; | |
case json_type_boolean: | |
val_type_str = "val is a boolean"; | |
break; | |
case json_type_double: | |
val_type_str = "val is a double"; | |
break; | |
case json_type_int: | |
val_type_str = "val is an integer"; | |
break; | |
case json_type_string: | |
val_type_str = "val is a string"; | |
str = (char *) json_object_get_string(val); | |
break; | |
case json_type_object: | |
val_type_str = "val is an object"; | |
break; | |
case json_type_array: | |
val_type_str = "val is an array"; | |
break; | |
} | |
printf("%s", val_type_str); | |
if (str) | |
printf("\t->\t\"%s\"", str); | |
printf("\n"); | |
str = NULL; | |
} | |
printf("\nDetails of the security code:\n"); | |
// Get the json_object associated to the "security-code" key in secu_code | |
json_object_object_get_ex(object, "security-code", &secu_code); | |
// For each case of the secu_code array | |
for (i = 0; i < json_object_array_length(secu_code); i++) { | |
// Set in tmp the json_object of the secu_code array at index i | |
tmp = json_object_array_get_idx(secu_code, i); | |
printf("security-code[%d] = %s\n", i, json_object_to_json_string(tmp)); | |
} | |
printf("\nJson in plain text: \n"); | |
printf("---\n%s\n---\n", json_object_to_json_string(object)); | |
json_object_put(object); | |
return 0; | |
} |
Thanks!
thanks!
Hi,
where can I find #include <json.h> ?
Hi,
where can I find #include <json.h> ?
Hi, that would be a system library, on my system the package is named libjson-c
.
Hi,
where can I find #include <json.h> ?Hi, that would be a system library, on my system the package is named
libjson-c
.
Sorry but I don't understand. Where is your system? Where can I find that? Can u send me a link?
Thanks
Hi,
where can I find #include <json.h> ?Hi, that would be a system library, on my system the package is named
libjson-c
.Sorry but I don't understand. Where is your system? Where can I find that? Can u send me a link?
Thanks
you just have to install libjson-c in your system.
If you are using ubuntu, you can install using the following commands.
sudo apt install libjson-c-dev
sudo apt-get install libjson-c-dev
Hi,
Thanks for the replay, but I'm not using Ubuntu, just Windows...
Is it posible that to install with Windows OP and how?
Thnaks
Hi,
where can I find #include <json.h> ?Hi, that would be a system library, on my system the package is named
libjson-c
.Sorry but I don't understand. Where is your system? Where can I find that? Can u send me a link?
Thanksyou just have to install libjson-c in your system. If you are using ubuntu, you can install using the following commands.
sudo apt install libjson-c-dev sudo apt-get install libjson-c-dev
You only needed one of the commands.... Don't confuse the noobs lmao
Hi, Thanks for the replay, but I'm not using Ubuntu, just Windows... Is it posible that to install with Windows OP and how?
Thnaks
You'll want to look up how to install the libraries for Windows
good