Try it yourself with our free Json Formatter tool — runs entirely in your browser, no signup needed.

How to Format JSON in C

How to Format JSON in C

JSON (JavaScript Object Notation) is a lightweight data interchange format that is widely used for exchanging data between web servers, web applications, and mobile apps. When working with JSON data in C, it's essential to format it correctly to ensure it's human-readable and easily parseable. In this guide, we'll explore how to format JSON in C, covering the basics, common edge cases, and performance tips.

Quick Example

Here's a minimal example that formats a JSON string using the jansson library:

#include <jansson.h>

int main() {
    json_t *root = json_object();
    json_object_set_new(root, "name", json_string("John Doe"));
    json_object_set_new(root, "age", json_integer(30));

    char *pretty_json = json_dumps(root, JSON_INDENT(4));
    printf("%s\n", pretty_json);

    json_decref(root);
    free(pretty_json);
    return 0;
}

This code creates a JSON object, sets two properties, and then dumps the JSON to a string with indentation.

Step-by-Step Breakdown

Let's walk through the code line by line:

  • json_t *root = json_object();: We create a new JSON object using the json_object() function from the jansson library.
  • json_object_set_new(root, "name", json_string("John Doe"));: We set a new property called "name" with the value "John Doe" using the json_object_set_new() function.
  • json_object_set_new(root, "age", json_integer(30));: We set another property called "age" with the value 30 using the json_object_set_new() function.
  • char *pretty_json = json_dumps(root, JSON_INDENT(4));: We use the json_dumps() function to serialize the JSON object to a string, with an indentation of 4 spaces.
  • printf("%s\n", pretty_json);: We print the formatted JSON string to the console.
  • json_decref(root);: We decrement the reference count of the JSON object to free its memory.
  • free(pretty_json);: We free the memory allocated for the formatted JSON string.

Handling Edge Cases

Empty/Null Input

When handling empty or null input, we should check for these cases before attempting to format the JSON:

json_t *root = json_object();
if (root == NULL) {
    // Handle null input
    return;
}

Invalid Input

When handling invalid input, we should check the return value of json_dumps():

char *pretty_json = json_dumps(root, JSON_INDENT(4));
if (pretty_json == NULL) {
    // Handle invalid input
    return;
}

Large Input

When handling large input, we should consider using a streaming JSON parser to avoid memory issues:

json_t *root = json_loads(input_string, 0, NULL);
if (root == NULL) {
    // Handle large input
    return;
}

Unicode/Special Characters

When handling Unicode or special characters, we should ensure that our JSON library supports these characters:

json_t *root = json_object();
json_object_set_new(root, "name", json_string("Jöhn Döe"));

Common Mistakes

1. Not Checking for Null Input

Wrong code:

json_t *root = json_object();
char *pretty_json = json_dumps(root, JSON_INDENT(4));

Corrected code:

json_t *root = json_object();
if (root != NULL) {
    char *pretty_json = json_dumps(root, JSON_INDENT(4));
    // ...
}

2. Not Handling Invalid Input

Wrong code:

char *pretty_json = json_dumps(root, JSON_INDENT(4));
printf("%s\n", pretty_json);

Corrected code:

char *pretty_json = json_dumps(root, JSON_INDENT(4));
if (pretty_json != NULL) {
    printf("%s\n", pretty_json);
    free(pretty_json);
}

3. Not Freeing Memory

Wrong code:

json_t *root = json_object();
char *pretty_json = json_dumps(root, JSON_INDENT(4));
printf("%s\n", pretty_json);

Corrected code:

json_t *root = json_object();
char *pretty_json = json_dumps(root, JSON_INDENT(4));
printf("%s\n", pretty_json);
json_decref(root);
free(pretty_json);

Performance Tips

  1. Use a streaming JSON parser to avoid loading the entire JSON document into memory.
  2. Use the json_dumps() function with the JSON_COMPACT flag to reduce the size of the output JSON string.
  3. Avoid using the json_loads() function with large input strings, as it can cause memory issues.

FAQ

Q: What is the best way to format JSON in C?

A: The best way to format JSON in C is to use a JSON library such as jansson, which provides a simple and efficient way to parse and generate JSON data.

Q: How do I handle large JSON input in C?

A: You can use a streaming JSON parser to handle large JSON input in C, which allows you to parse the JSON data in chunks rather than loading the entire document into memory.

Q: What is the difference between json_dumps() and json_dumpf()?

A: json_dumps() serializes a JSON object to a string, while json_dumpf() serializes a JSON object to a file.

Q: How do I handle Unicode characters in JSON strings?

A: Most JSON libraries, including jansson, support Unicode characters in JSON strings. You can use Unicode characters in your JSON strings without any special handling.

Q: What is the best way to debug JSON formatting issues in C?

A: You can use a JSON validator or a debugger to debug JSON formatting issues in C. You can also use the json_dumps() function with the JSON_INDENT flag to format the JSON output with indentation, making it easier to read and debug.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp