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

How to Parse JSON in C

How to parse 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. As a C developer, you may need to parse JSON data in your application, whether it's to read configuration files, exchange data with a web service, or store data in a database. In this article, we will explore how to parse JSON in C using the popular jansson library.

Quick Example

Here is a minimal example that demonstrates how to parse a JSON string in C:

#include <jansson.h>
#include <stdio.h>

int main() {
    const char *json_string = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
    json_t *root = json_loads(json_string, 0, NULL);
    if (!root) {
        printf("Error parsing JSON\n");
        return 1;
    }

    const char *name = json_string_value(json_object_get(root, "name"));
    int age = json_integer_value(json_object_get(root, "age"));
    printf("Name: %s, Age: %d\n", name, age);

    json_decref(root);
    return 0;
}

To compile and run this example, you'll need to install the jansson library and link against it:

$ sudo apt-get install libjansson-dev
$ gcc -o example example.c -ljansson

Step-by-Step Breakdown

Let's walk through the code line by line:

  1. #include <jansson.h>: We include the jansson header file to use its JSON parsing functions.
  2. #include <stdio.h>: We include the stdio header file for input/output operations.
  3. const char *json_string = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";: We define a JSON string that we want to parse.
  4. json_t *root = json_loads(json_string, 0, NULL);: We use the json_loads function to parse the JSON string into a json_t object. The second argument is the flags, which we set to 0 for no flags. The third argument is the error pointer, which we set to NULL.
  5. if (!root) { ... }: We check if the parsing was successful. If not, we print an error message and exit.
  6. const char *name = json_string_value(json_object_get(root, "name"));: We use the json_object_get function to get the value of the "name" key from the root object, and then use the json_string_value function to get the string value of the result.
  7. int age = json_integer_value(json_object_get(root, "age"));: We use the json_object_get function to get the value of the "age" key from the root object, and then use the json_integer_value function to get the integer value of the result.
  8. printf("Name: %s, Age: %d\n", name, age);: We print the parsed values to the console.
  9. json_decref(root);: We decrement the reference count of the root object to free its memory.

Handling Edge Cases

Here are some common edge cases that you may encounter when parsing JSON in C:

Empty/Null Input

If the input JSON string is empty or null, the json_loads function will return NULL. You can handle this case by checking for NULL before using the root object:

if (json_string == NULL || *json_string == '\0') {
    printf("Error: empty input\n");
    return 1;
}

Invalid Input

If the input JSON string is invalid (e.g., malformed syntax), the json_loads function will return NULL. You can handle this case by checking for NULL before using the root object:

if (!root) {
    printf("Error parsing JSON\n");
    return 1;
}

Large Input

If the input JSON string is very large, you may need to allocate more memory to parse it. You can use the json_loads_len function to specify the length of the input string:

json_t *root = json_loads_len(json_string, strlen(json_string), 0, NULL);

Unicode/Special Characters

JSON supports Unicode characters, so you may need to handle them when parsing. The jansson library uses UTF-8 encoding to represent Unicode characters, so you can use the json_string_value function to get the string value of a JSON string:

const char *name = json_string_value(json_object_get(root, "name"));

Common Mistakes

Here are some common mistakes that developers make when parsing JSON in C:

Mistake 1: Not Checking for Errors

// WRONG
json_t *root = json_loads(json_string, 0, NULL);
// Use root object without checking for errors

// CORRECT
json_t *root = json_loads(json_string, 0, NULL);
if (!root) {
    printf("Error parsing JSON\n");
    return 1;
}

Mistake 2: Not Freeing Memory

// WRONG
json_t *root = json_loads(json_string, 0, NULL);
// Use root object and forget to free its memory

// CORRECT
json_t *root = json_loads(json_string, 0, NULL);
// Use root object
json_decref(root);

Mistake 3: Not Handling Null Values

// WRONG
const char *name = json_string_value(json_object_get(root, "name"));
// Use name without checking for NULL

// CORRECT
const char *name = json_string_value(json_object_get(root, "name"));
if (name == NULL) {
    printf("Error: null value\n");
    return 1;
}

Performance Tips

Here are some practical performance tips for parsing JSON in C:

Tip 1: Use json_loads_len for Large Input

Using json_loads_len can improve performance when parsing large JSON input strings:

json_t *root = json_loads_len(json_string, strlen(json_string), 0, NULL);

Tip 2: Use json_object_get with a Cache

Using a cache to store the results of json_object_get can improve performance when accessing the same keys multiple times:

json_t *name_obj = json_object_get(root, "name");
const char *name = json_string_value(name_obj);

Tip 3: Avoid Deep Copying

Avoid deep copying the JSON object tree to improve performance:

// WRONG
json_t *copy = json_deep_copy(root);

// CORRECT
json_t *root = json_loads(json_string, 0, NULL);
// Use root object directly

FAQ

Q: What is the best JSON parsing library for C?

A: The jansson library is a popular and widely-used JSON parsing library for C.

Q: How do I handle errors when parsing JSON in C?

A: Check the return value of json_loads and use error handling functions like json_error_t to handle errors.

Q: Can I use jansson with C++?

A: Yes, jansson can be used with C++.

Q: How do I parse large JSON input strings?

A: Use json_loads_len to specify the length of the input string.

Q: Can I use jansson with other programming languages?

A: Yes, jansson can be used with other programming languages like Python and Java.

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