blob: fd413789d0287dd94adbe5405f85fbea8cf968be [file] [log] [blame] [view] [raw]
---
title: facil.io - JSON support
toc: true
layout: api
---
# Using facil.io's JSON support
Parsing, editing and outputting JSON in C can be easily accomplished using [facil.io's dynamic types](fiobj.md) (`fiobj_s`).
There are [faster alternatives as well as slower alternatives out there](json_performance.html) (i.e., the Qajson4c library is probably the most balanced alternative).
However, `facil.io` offers the added benefit of complete parsing from JSON to object. This is in contrast to some parsers that offer a mid-way structure (often a linked list of JSON nodes) or lazy (delayed) parsing for types such as `true`, `false` and Numbers.
`facil.io` also offers the added benefit of complete formatting from a framework wide object type (`FIOBJ`) to JSON. This is in contrast to some solutions that require a linked list of node structures.
## Parsing JSON
The `facil.io` parser will parse any C string until it either consumes the whole string or completes parsing of a JSON object.
For example, the following program will minify (or prettify) JSON data:
```c
// include the `fiobj` module from `facil.io`
#include "fiobj.h"
#include <string.h>
// this is passed as an argument to `fiobj_obj2json`
// change this to 1 to prettify.
#define PRETTY 0
int main(int argc, char const *argv[]) {
// a default string to demo
const char * json = u8"{\n\t\"id\":1,\n"
"\t// comments are ignored.\n"
"\t\"number\":42,\n"
"\t\"float\":42.42,\n"
"\t\"string\":\"𝄞 oh yeah...\",\n"
"\t\"hash\":{\n"
"\t\t\"nested\":true\n"
"\t},\n"
"\t\"symbols\":[\"id\","
"\"number\",\"float\",\"string\",\"hash\",\"symbols\"]\n}";
if (argc == 2) {
// accept command line JSON data
json = argv[1];
}
printf("\nattempting to parse:\n%s\n", json);
// actual code for parsing the JSON
FIOBJ obj;
size_t consumed = fiobj_json2obj(&obj, json, strlen(json));
// test for errors
if (!obj) {
printf("\nERROR, couldn't parse data.\n");
exit(-1);
}
// format the JSON back to a String object and print it up
FIOBJ str = fiobj_obj2json(obj, PRETTY);
printf("\nParsed JSON input was: %lu bytes"
"\nJSON output is %lu bytes:\n\n%s\n\n",
consumed, (size_t)fiobj_obj2cstr(str).len, fiobj_obj2cstr(str).data);
// cleanup
fiobj_free(str);
fiobj_free(obj);
return 0;
}
```