cJSON Code Generator & C Struct Parser
Automatically generate ANSI C/C++ structs, deserialization parsers, serializers, null-checks, and memory-safe cJSON_Delete() routines directly from sample JSON. Designed for ESP32, STM32, Arduino, and low-level network microservices.
Developing with DaveGamble's cJSON in C and C++
When programming embedded hardware, firmware devices (like ESP32, ESP8266, STM32, Nordic nRF), or high-throughput C applications, parsing dynamic JSON payloads manually is error-prone and fraught with buffer overflows and memory leak risks. The cJSON library provides an elegant, battle-tested DOM representation of JSON entities in pure ANSI C.
1. Type-Safe Field Extraction
cJSON models values using a tagged union inside cJSON structs. To safely extract fields without segmentation faults, always test item presence and type tags:
cJSON *item = cJSON_GetObjectItemCaseSensitive(root, "temperature");
if (cJSON_IsNumber(item)) {
double temp = item->valuedouble;
}
2. Safe Dynamic Memory Management
Each call to cJSON_Parse() traverses the incoming string and allocates linked lists of cJSON structs using malloc(). To prevent memory leaks, you must invoke cJSON_Delete(root) exactly once when the entire parse tree is no longer needed.
3. String Buffering and Printing
When serializing C data structures back into JSON strings:
cJSON_Print(root): Outputs human-readable, formatted JSON with indentation and newlines.cJSON_PrintUnformatted(root): Generates minified JSON with all extraneous whitespace stripped, ideal for HTTP POST payloads or MQTT telemetry transmissions.- Crucial: Remember to call
cJSON_free(rendered_string)to free the buffer returned bycJSON_Print().
Frequently Asked Questions
cJSON_Parse() or cJSON_CreateObject(), heap memory is dynamically allocated. Developers must always call cJSON_Delete(root) on the root pointer once processing finishes to prevent memory leaks. Deleting a child node directly attached to a tree will cause double-free panics.
cJSON_GetObjectItem matches JSON keys in a case-insensitive manner, which can violate RFC 8259 JSON specifications. Modern best practice is to always use cJSON_GetObjectItemCaseSensitive() to guarantee strict case matching and avoid accidental key collisions.
stdio.h, stdlib.h, string.h, stdbool.h) alongside cJSON.h.