{"id":17127971,"url":"https://github.com/rohanrhu/jsonic","last_synced_at":"2026-03-04T18:04:13.169Z","repository":{"id":90318612,"uuid":"169887201","full_name":"rohanrhu/jsonic","owner":"rohanrhu","description":"⭕ Tricky, super fast and dumb JSON library for C/C++","archived":false,"fork":false,"pushed_at":"2023-12-12T06:55:24.000Z","size":780,"stargazers_count":20,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-10-20T00:43:24.262Z","etag":null,"topics":["c","c-json","cpp-json","json","json-c","json-cpp","json-lib","json-libraries","json-library","json-parse","json-parser","json-parsing","json-parsing-library","json-reader","json-reader-library"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rohanrhu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2019-02-09T16:32:12.000Z","updated_at":"2023-12-11T23:36:07.000Z","dependencies_parsed_at":"2023-12-12T01:32:04.080Z","dependency_job_id":"2a167f2f-6304-4930-96c1-31dae188049d","html_url":"https://github.com/rohanrhu/jsonic","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rohanrhu/jsonic","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rohanrhu%2Fjsonic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rohanrhu%2Fjsonic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rohanrhu%2Fjsonic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rohanrhu%2Fjsonic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rohanrhu","download_url":"https://codeload.github.com/rohanrhu/jsonic/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rohanrhu%2Fjsonic/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30088348,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T15:40:14.053Z","status":"ssl_error","status_checked_at":"2026-03-04T15:40:13.655Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","c-json","cpp-json","json","json-c","json-cpp","json-lib","json-libraries","json-library","json-parse","json-parser","json-parsing","json-parsing-library","json-reader","json-reader-library"],"created_at":"2024-10-14T19:05:53.788Z","updated_at":"2026-03-04T18:04:13.077Z","avatar_url":"https://github.com/rohanrhu.png","language":"C","funding_links":["https://patreon.com/EvrenselKisilik)**","https://patreon.com/EvrenselKisilik"],"categories":[],"sub_categories":[],"readme":"# Jsonic\n\n[![GitHub issues](https://img.shields.io/github/issues/rohanrhu/jsonic?style=flat-square\u0026color=red)](https://github.com/rohanrhu/jsonic/issues)\n[![GitHub forks](https://img.shields.io/github/forks/rohanrhu/jsonic?style=flat-square)](https://github.com/rohanrhu/jsonic/network)\n[![GitHub stars](https://img.shields.io/github/stars/rohanrhu/jsonic?style=flat-square)](https://github.com/rohanrhu/jsonic/stargazers)\n[![Support me on Patreon](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fshieldsio-patreon.vercel.app%2Fapi%3Fusername%3DEvrenselKisilik%26type%3Dpatrons\u0026style=flat-square)](https://patreon.com/EvrenselKisilik)****\n[![Donate with BTC](https://shields.io/badge/donate-3KBtYfaAT42uVFd6D2XFRDTAoErLz73vpL-yellow?logo=bitcoin\u0026style=flat-square)](#donation)\n\nHigh performance tricky and dumb JSON reader for C/C++ that can be super fast if you use it correctly.\n\n## Performance\n\nBenchmarks are found in `benchmarks/` folder.\n\n### Benchmark for `twitter.json`\n\nHere is `twitter.json` benchmark results for Jsonic vs Boost.JSON:\n\n| `statuses[].id`, `statuses[].text`, `statuses[].user.name`                     | `statuses[].id` only                                                               |\n|--------------------------------------------------------------------------------|------------------------------------------------------------------------------------|\n| ![Jsonic vs Boost.JSON benchmark for canada.json](media/benchmark-twitter.png) | ![Jsonic vs Boost.JSON benchmark for twitter.json](media/benchmark-twitter-a1.png) |\n\n### Benchmark for `canada.json`\n\nHere is `canada.json` benchmark results for Jsonic vs Boost.JSON:\n\n![Jsonic vs Boost.JSON benchmark for canada.json](media/benchmark-canada.png)\n\nFor this benchmark, the winner was changing for each time so I just choosed one of times that Jsonic was winner for adding here :)\n\n### More Details About Benchmarks\n\n| Condition     | Benchmarked on                                           |\n| ------------- | -------------------------------------------------------- |\n| **CPU:**      | Apple M1                                                 |\n| **OS:**       | MacOS Ventura                                            |\n| **Compiler:** | CLang (Apple clang version 14.0.0 (clang-1400.0.29.202)) |\n| **Flags:**    | -O3                                                      |\n\nActually I'm very lazy for benchmarks, `canada.json` benchmark was originated from @RoyBellingan you can find the first results [here](https://gist.github.com/RoyBellingan/54e82fb2933db3982606a31b5d26e1e9) that were just before latest performance enhancements I've just made on Jsonic.\n\n`twitter.json` benchmark is a simple example for Jsonic's dumb philosophy. I will make benchmarks for more complicated real-world scenarios, especially for kinda search-purposed scenarios that are what Jsonic is super fast for.\n\nExamples are not benchmarks. The documentation and examples have bad and good usages of Jsonic to tell you how to use it with the correct way that makes Jsonic super fast!\n\n## Jsonic Philosophy\n\nJsonic is designed to work with your own iterations for your specific use cases. Please read the documentation and work on examples carefully.\n\n## Including and Compiling\n\n### Including\n\n```c\n#include \"jsonic.h\"\n```\n\n### Building and Linking\n\nYou can just build and link `jsonic.o` and use `jsonic.h`. Don't forget to use `-O3` flag for compilation.\n\nUsing `make` will build Jsonic and examples:\n\n```bash\ncd /path/to/jsonic\nmake\ncd /path/to/your/project\ngcc -o example.exe example.c /path/to/jsonic/jsonic.o -I /path/to/jsonic\n```\n\n## Reading JSON\n\n### Jsonic Node\n\nEvery JSON result is a `jsonic_node_t` object in jsonic.\n\n```c\ntypedef struct jsonic_node jsonic_node_t;\nstruct jsonic_node {\n    char* key;\n    char* val;\n    jsonic_node_type_t type;\n    unsigned int len;\n    unsigned int pos;\n    unsigned int ending;\n    ...\n};\n```\n\nYou will use structure members: `type`, `key`, `val`, `len` and `pos` for reading JSON.\n\n`val` is useable for **string**, **number**, **boolean** and **null** types. `val` is a NULL Terminated String and you can get length of string via `len` for string values.\n`pos` is useable for getting iteration position for arrays/objects.\n\n`key` is useable NULL Terminated String for Key=\u003eValue iteration results.\n\n#### String Values\n\nString values come as NULL Terminated String in `val` and you can check them with `node-\u003etype == JSONIC_STRING`.\n\n#### Number Values\n\nNumber values come as NULL Terminated String in `val` and you can check them with `node-\u003etype == JSONIC_NUMBER`.\n\n#### Boolean Values\n\nBoolean values come as NULL Terminated String in `val`. `val` maybe `\"1\"` or `\"0\"` for boolean values and you can check them with `node-\u003etype == JSONIC_BOOLEAN`.\n\n#### Null Values\n\nNull values come as NULL Terminated String in `val` as `\"0\"` and you can check them with `node-\u003etype == JSONIC_NULL`.\n\n#### Result Length\n\n`len` is useable for **string**, **number**, **boolean** and **null** types and does not give length of an **array**.\nYou can use [jsonic_array_length()](#jsonic_array_length) or [jsonic_array_length_from()](#jsonic_array_length_from) for getting an array's length.\n\nThe length will be found in `result.length` and the position index of the rest of JSON will be found in `result.index`.\n\nIf you are going to get something from the rest of JSON just after counting previous object which is an array, you can just use `result.index` as from position.\nThere is `jsonic_from_length()` that simply returns `length.index`.\n\nJsonic will already manage it in a scenario like this:\n\n```c\njsonic_length_t count = jsonic_array_length(json_string, powers);\nprintf(\"Powers (%d total):\\n\", jsonic_array_length(json_string, powers).length);\n\nmeow = jsonic_object_iter(json_string, member, powers, \"meow\");\nprintf(\"Meow: %s\\n\", meow-\u003eval); // ! purr\n// ! This following tricky usage is the same of the above one because Jsonic already knows\n// ! that we already iterated chars to get the length of `powers` array, so you don't need to do this.\nmeow = jsonic_object_iter_index(json_string, member, powers, jsonic_from_length(count), \"meow\");\nprintf(\"Meow: %s\\n\", meow-\u003eval); // ! purr\n```\n\n#### Iteration Position\n\n`node-\u003epos` is useable for objects and arrays both. It gives current index of current iterated array item or object key\u0026value.\nAlso you can use it for not found result nodes.\n\n### JSON Types\n\n```c\nenum JSONIC_NODE_TYPES {\n    JSONIC_NONE,\n    JSONIC_OBJECT,\n    JSONIC_ARRAY,\n    JSONIC_STRING,\n    JSONIC_NUMBER,\n    JSONIC_BOOLEAN,\n    JSONIC_NULL\n};\ntypedef enum JSONIC_NODE_TYPES jsonic_node_type_t;\n```\n\n#### Not Found Results\n\nYou will get a node with type `JSONIC_NONE` for not found results and of course you need freeing it.\n\n##### Checking Length for Not Found Results\n\nYou can check how many items itered at total including searching the not found result node with `node-\u003epos`.\n\n###### Examples\n\n```c\njsonic_node_t* not_exists_key = jsonic_object_get(json_string, root, \"not_exists_key\");\nprintf(\"Count: %d\\n\\n\", not_exists_key-\u003epos); // not_exists_key-\u003epos+1 is how many items itered.\n```\n\n```c\njsonic_node_t* an_exists_key = jsonic_object_get(json_string, root, \"an_exists_key\");\njsonic_node_t* not_exists_key = jsonic_object_iter(json_string, root, an_exists_key, \"not_exists_key\");\n\n// not_exists_key-\u003epos+1 is how many items itered at total including an_exists_key.\nprintf(\"Count: %d\\n\\n\", not_exists_key-\u003epos);\n```\n\n```c\njsonic_node_t* not_exists_item = jsonic_array_get(json_string, array, 100);\nprintf(\"Count: %d\\n\\n\", not_exists_item-\u003epos); // not_exists_item-\u003epos+1 is how many items itered.\n```\n\n```c\njsonic_node_t* not_exists_item = jsonic_array_iter(json_string, array, exists_item, 100);\nprintf(\"Count: %d\\n\\n\", not_exists_item-\u003epos); // not_exists_item-\u003epos+1 is how many items itered at total.\n```\n\n### Functions\n\nThere are various functions in Jsonic for walking and iterating on JSON.\n\n#### jsonic_from_file()\n\n```c\nchar* jsonic_from_file(char* fname);\n```\n\n#### jsonic_free()\n\n```c\nvoid jsonic_free(jsonic_node_t** node);\n```\n\nExample:\n\n```c\njsonic_node_t* members = jsonic_object_get(json_string, jsonic_get_root(json_string), \"members\");\n...\njsonic_free(\u0026members); // free'd and members is set to NULL\n```\n\n#### jsonic_free_addr()\n\n```c\nvoid jsonic_free_addr(jsonic_node_t* node);\n```\n\n#### jsonic_get_root()\n\n```c\njsonic_node_t* jsonic_get_root(char* json_str);\n```\n\n##### Checking Root\n\n```c\njsonic_node_t* root = jsonic_get_root(json_string);\n\nif (root-\u003etype == JSONIC_NONE) {\n    printf(\"JSON root is none.\\n\");\n} else if (root-\u003etype == JSONIC_OBJECT) {\n    printf(\"JSON root is an object.\\n\");\n} else if (root-\u003etype == JSONIC_ARRAY) {\n    printf(\"JSON root is an array.\\n\");\n} else if (root-\u003etype == JSONIC_STRING) {\n    printf(\"JSON root is a string.\\n\");\n} else if (root-\u003etype == JSONIC_NUMBER) {\n    printf(\"JSON root is a number.\\n\");\n} else if (root-\u003etype == JSONIC_BOOLEAN) {\n    printf(\"JSON root is a boolean.\\n\");\n} else if (root-\u003etype == JSONIC_NULL) {\n    printf(\"JSON root is null.\\n\");\n}\n```\n\n#### jsonic_object_get()\n\n```c\njsonic_node_t* jsonic_object_get(char* json_str, jsonic_node_t* current, char* key);\n```\n\n##### Get an Object Key\n\nGet a key from JSON root:\n\n```c\njsonic_object_get(json_string, jsonic_get_root(json_string), \"someKey\");\n```\n\nor find an existing node:\n\n```c\njsonic_object_get(json_string, some_object, \"someKey\");\n```\n\n#### jsonic_array_get()\n\n```c\njsonic_node_t* jsonic_array_get(char* json_str, jsonic_node_t* current, int index);\n```\n\n##### Get an Element of Array\n\nGet an array element from JSON Array root:\n\n```c\njsonic_array_get(json_string, jsonic_get_root(json_string), 5);\n```\n\nor find an existing node:\n\n```c\njsonic_array_get(json_string, some_array, 5);\n```\n\n##### Inline Usage\n\nIf you are using these functions as inline, application will have memory leaks and it will be non-memory-safe, so you may get `SIGSEGV`!\n\n```c\nextern jsonic_node_t* jsonic_get_root(char* json_str);\nextern jsonic_node_t* jsonic_object_get(char* json_str, jsonic_node_t* current, char* key);\nextern jsonic_node_t* jsonic_object_iter(char* json_str, jsonic_node_t* current, jsonic_node_t* from, char* key);\nextern jsonic_node_t* jsonic_object_iter_free(char* json_str, jsonic_node_t* current, jsonic_node_t* from, char* key);\nextern jsonic_node_t* jsonic_object_iter_kv(char* json_str, jsonic_node_t* current, jsonic_node_t* from);\nextern jsonic_node_t* jsonic_object_iter_kv_free(char* json_str, jsonic_node_t* current, jsonic_node_t* from);\nextern jsonic_node_t* jsonic_array_get(char* json_str, jsonic_node_t* current, int index);\nextern jsonic_node_t* jsonic_array_iter(char* json_str, jsonic_node_t* current, jsonic_node_t* node, int index);\nextern jsonic_node_t* jsonic_array_iter_free(char* json_str, jsonic_node_t* current, jsonic_node_t* node, int index);\n```\n\n###### Memory-Safety Example\n\nNon-memory-safe usage:\n\n```c\nprintf(\"Squad: %s\\n\", jsonic_object_get(json_string, jsonic_get_root(json_string), \"squadName\")-\u003eval);\n```\n\nThis is memory-safe usage:\n\n```c\njsonic_node_t* root = jsonic_get_root(json_string);\njsonic_node_t* name = jsonic_object_get(json_string, root, \"squadName\");\n\nif (name != NULL) {\n    if (name-\u003etype == JSONIC_STRING) {\n        printf(\"Squad: %s\\n\", name-\u003eval);\n    }\n\n    jsonic_free(\u0026name);\n}\n\njsonic_free(\u0026root);\n```\n\n#### jsonic_array_length()\n\n```c\njsonic_length_t jsonic_array_length(char* json_str, jsonic_node_t* array);\n```\n\n#### jsonic_array_length_from()\n\n```c\njsonic_length_t jsonic_array_length_from(char* json_str, jsonic_node_t* array, jsonic_node_t* from);\n```\n\n#### jsonic_array_iter()\n\n```c\njsonic_node_t* jsonic_array_iter(char* json_str, jsonic_node_t* current, jsonic_node_t* node, int index);\n```\n\nUseable for iterating arrays. Starts reading from given `node` in `current`, so `index` parameter must start from `0`, it will start reading from given `node`.\n\n#### jsonic_array_iter_free()\n\n```c\njsonic_node_t* jsonic_array_iter_free(char* json_str, jsonic_node_t* current, jsonic_node_t* node, int index);\n```\n\nSame as `jsonic_array_iter()` but frees given jsonic object (`node`).\n\n##### Iterating Arrays\n\nYou can use `jsonic_array_iter()` or `jsonic_array_iter_free()`.\n\n```c\njsonic_node_t* power = NULL;\nfor (;;) {\n    power = jsonic_array_iter_free(json_string, powers, power, 0);\n    if (power-\u003etype == JSONIC_NONE) break;\n}\n```\n\n**Notice:** Using `jsonic_array_iter()` instead of `jsonic_array_iter_free()` would be non-memory safe for most of times.\n\n#### jsonic_object_iter()\n\n```c\njsonic_node_t* jsonic_object_iter(char* json_str, jsonic_node_t* current, jsonic_node_t* from, char* key);\n```\n\nUseable for getting a key's value with more performance. It starts reading from given `node` in `current`.\n\n**Notice:** You must be sure your key is located after given `node` in JSON.\n\n#### jsonic_object_iter_free()\n\n```c\njsonic_node_t* jsonic_object_iter_free(char* json_str, jsonic_node_t* current, jsonic_node_t* from, char* key);\n```\n\nSame as `jsonic_object_iter()` but frees given jsonic object (`from`).\n\n#### jsonic_object_iter_kv()\n\n```c\njsonic_node_t* kv = jsonic_object_iter_kv(json_string, current, from);\n```\n\nUseable for object iteration as `key: value` pairs in `current` starting from `from`.\n\n#### jsonic_object_iter_kv_free()\n\n```c\njsonic_node_t* kv = jsonic_object_iter_kv_free(json_string, current, from);\n```\n\nSame as `jsonic_object_iter_kv()` but frees given jsonic object (`from`).\n\n##### Iterating Objects with a Key\n\nYou can use `jsonic_object_iter()` or `jsonic_object_iter_free()`.\n\n```c\njsonic_node_t* node = jsonic_object_iter(json_string, something, previousNode, \"someKey\");\n```\n\n##### Iterating Objects as `Key: Value` Pairs\n\nYou can use `jsonic_object_iter_kv()` or `jsonic_object_iter_kv_free()`.\n\n```c\njsonic_node_t* key = NULL;\nfor (;;) {\n    key = jsonic_object_iter_kv_free(json_string, keys, key);\n    if (key-\u003etype == JSONIC_NONE) break;\n    \n    if ((key-\u003etype == JSONIC_STRING) || (key-\u003etype == JSONIC_NUMBER)) {\n        printf(\"%s =\u003e %s\\n\", key-\u003ekey, key-\u003eval);\n    }\n}\n```\n\n## Work under the hood?\n\nSometimes, you may want to be more ticky. Here is `jsonic_get()`:\n\n```c\nextern jsonic_node_t* jsonic_get(\n    char* json_str,\n    jsonic_node_t* current,\n    char* key,\n    unsigned int index,\n    unsigned int from,\n    jsonic_node_t* from_object,\n    int is_get_root,\n    int is_kv_iter\n)\n```\n\n## Compile and Run Examples\n\nYou can compile and run examples in `examples/` directory:\n\n```bash\ncd examples/heroes\nmake\n```\n\nand run on Windows:\n\n```bash\nheroes.exe\n```\n\non Linux:\n\n```bash\n./heroes.exe\n```\n\n## Example\n\nAn example for reading JSON data\n\n```c\nchar* json_string = jsonic_from_file(\"heroes.json\");\n\nif (json_string == NULL) {\n    printf(\"JSON file not found.\\n\");\n    exit(0);\n}\n\njsonic_node_t* root = jsonic_get_root(json_string);\n\njsonic_node_t* members = jsonic_object_get(json_string, root, \"members\");\njsonic_node_t* member = jsonic_array_get(json_string, members, 1);\njsonic_node_t* powers = jsonic_object_get(json_string, member, \"powers\");\n\n// ! inline usage: non-free'd nodes and non-safe pointers!..\n// using jsonic_object_get() is poor way because of reading it from start of json each time!\n// use jsonic_object_iter() or jsonic_object_iter_free() instead of jsonic_object_get().\n// ! don't use jsonic_object_get() for sequenced items, use jsonic_object_iter() instead!\nprintf(\"Squad: %s\\n\", jsonic_object_get(json_string, root, \"squadName\")-\u003eval);\nprintf(\"Active: %s\\n\", jsonic_object_get(json_string, root, \"active\")-\u003eval);\nprintf(\"Formed: %s\\n\", jsonic_object_get(json_string, root, \"formed\")-\u003eval);\nprintf(\"Name: %s\\n\", jsonic_object_get(json_string, member, \"name\")-\u003eval);\nprintf(\"Age: %s\\n\", jsonic_object_get(json_string, member, \"age\")-\u003eval);\n\njsonic_length_t count = jsonic_array_length(json_string, powers);\nprintf(\"Powers (%d total):\\n\", count.length);\n\njsonic_node_t* meow;\n\n// * More performance...\nmeow = jsonic_object_iter(json_string, member, powers, \"meow\");\nprintf(\"Meow: %s\\n\", meow-\u003eval); // ! purr\n// * This following tricky usage is the same of the above one because Jsonic already knows\n// * that we already iterated chars to get the length of `powers` array, so you don't need to do this.\nmeow = jsonic_object_iter_index(json_string, member, powers, jsonic_from_length(count), \"meow\");\nprintf(\"Meow: %s\\n\", meow-\u003eval); // ! purr\n\njsonic_node_t* power = NULL;\nfor (;;) {\n    power = jsonic_array_iter_free(json_string, powers, power, 0);\n    if (power-\u003etype == JSONIC_NONE) break;\n    \n    if (power-\u003etype == JSONIC_STRING) {\n        jsonic_length_t count = jsonic_array_length_from(json_string, powers, power);\n        \n        printf(\n            \"\\t%s (pos: %d, from len: %d)\\n\",\n            power-\u003eval,\n            power-\u003epos,\n            count.length\n        );\n    }\n}\n\njsonic_free(\u0026members);\njsonic_free(\u0026member);\njsonic_free(\u0026powers);\njsonic_free(\u0026root);\nfree(json_string);\n```\n\nExample JSON (heroes.json):\n\n```json\n{\n    \"squadName\": \"Super \\\"hero\\\" squad\",\n    \"homeTown\": \"Metro City\",\n    \"formed\": 2016,\n    \"secretBase\": \"Super tower\",\n    \"active\": true,\n    \"members\": [\n    {\n        \"name\": \"Molecule Man\",\n        \"age\": 29,\n        \"secretIdentity\": \"Dan Jukes\",\n        \"powers\": [\n            \"Radiation resistance\",\n            \"Turning tiny\",\n            \"Radiation blast\"\n        ],\n        \"meow\": \"purr\"\n    },\n    {\n        \"name\": \"Madame Uppercut\",\n        \"age\": 39,\n        \"secretIdentity\": \"Jane Wilson\",\n        \"powers\": [\n            \"Million tonne punch\",\n            \"Damage resistance\",\n            \"Superhuman reflexes\"\n        ],\n        \"meow\": \"purr\"\n    },\n    {\n        \"name\": \"Eternal Flame\",\n        \"age\": 1000000,\n        \"secretIdentity\": \"Unknown\",\n        \"powers\": [\n            \"Immortality\",\n            \"Heat Immunity\",\n            \"Inferno\",\n            \"Teleportation\",\n            \"Interdimensional travel\"\n        ],\n        \"meow\": \"purr\"\n    }\n    ]\n}\n\n```\n\n## JSON Type Checking\n\nYou must check JSON node for `jsonic_object_get()` or `jsonic_array_get()` from it. Otherwise you will get some absurd data. (e.g. Trying get a key's value from an array.)\n\n## Syntax Checking\n\nThis library does not check JSON syntax, so you may get `SIGSEGV` or maybe infinite loops for **corrupt JSONs**. Likewise in some cases of corrupt JSONs, it would work as properly.\n\n## ❤️ Donate\n\n### Patreon\n\n[![Support me on Patreon](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fshieldsio-patreon.vercel.app%2Fapi%3Fusername%3DEvrenselKisilik%26type%3Dpatrons\u0026style=for-the-badge)](https://patreon.com/EvrenselKisilik)\n\n### Cryptocurrencies\n\n| Currency | Address                                    |\n| -------- | ------------------------------------------ |\n| BTC      | bc1qhvlc762kwuzeawedl9a8z0duhs8449nwwc35e2 |\n| ETH      | 0x1D99B2a2D85C34d478dD8519792e82B18f861974 |\n| USDT     | 0x1D99B2a2D85C34d478dD8519792e82B18f861974 |\n| USDC     | 0x1D99B2a2D85C34d478dD8519792e82B18f861974 |\n| XMR      | 88qvS4sfUnLZ7nehFrz3PG1pWovvEgprcUhkmVLaiL8PVAFgfHjspjKPLhWLj3DUcm92rwNQENbJ1ZbvESdukWvh3epBUty |\n\n## License\n\nCopyright (C) 2018, Oğuzhan Eroğlu \u003crohanrhu2@gmail.com\u003e (https://oguzhaneroglu.com/)\n\nThis work is licensed under the terms of the MIT license.  \nFor a copy, see \u003chttps://opensource.org/licenses/MIT\u003e.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frohanrhu%2Fjsonic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frohanrhu%2Fjsonic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frohanrhu%2Fjsonic/lists"}