cJSON 是一个轻量级 JSON 解析库,仅 500 行 C 代码,高效解析 JSON 数据,适用于嵌入式设备和低资源环境。
cJSON 被物联网设备、工业控制系统广泛采用,成为 C 语言生态中 JSON 处理的标杆。
cJSO核心特点
单文件实现(仅需cJSON.c和cJSON.h)
支持C89/C90标准,兼容性强
MIT许可证,可免费商用
解析速度快,内存占用低
提供完整的JSON构建/解析/修改API
JSON解析
支持从字符串解析JSON数据
自动检测UTF-8编码(不支持其他编码)
错误定位功能(cJSON_GetErrorPtr)
JSON生成
将内存中的JSON对象树转换为字符串
支持格式化输出和紧凑输出两种模式
可自定义内存管理函数
数据结构操作
typedef struct cJSON {
struct cJSON *next, *prev; // 链表指针
struct cJSON *child; // 子节点
int type; // 数据类型
char *valuestring; // 字符串值
double valuedouble; // 数值
char *string; // 键名
} cJSON;
支持所有JSON类型:对象、数组、字符串、数字、布尔值、null
构建方式
| 方法 | 命令示例 | 特点 |
|---|---|---|
| 直接复制 | 复制cJSON.c和cJSON.h到项目 |
最简单,无依赖 |
| CMake | mkdir build && cd build && cmake .. |
支持跨平台,功能最完整 |
| Makefile | make all |
快速构建(已弃用,建议用CMake) |
| Vcpkg | vcpkg install cjson |
适合Windows开发 |
API示例
创建JSON对象
cJSON *root = cJSON_CreateObject();
cJSON_AddStringToObject(root, "name", "Awesome 4K");
cJSON *resolutions = cJSON_AddArrayToObject(root, "resolutions");
解析JSON
cJSON *monitor = cJSON_Parse(json_string);
cJSON *name = cJSON_GetObjectItemCaseSensitive(monitor, "name");
if(cJSON_IsString(name)) {
printf("Name: %s\n", name->valuestring);
}
内存管理
char *json_str = cJSON_Print(root); // 生成JSON字符串
cJSON_Delete(root); // 释放整个对象树
free(json_str); // 释放生成的字符串
性能特点
内存占用:基础结构体仅64字节(64位系统)
解析速度:可在嵌入式设备上高效运行
嵌套深度:默认支持1000层(可通过CJSON_NESTING_LIMIT修改)
注意事项
1、字符编码
仅支持UTF-8,不允许包含\0字符
2、线程安全 非线程安全设计,需自行管理多线程访问
3、浮点数精度 使用IEEE754双精度存储,数值范围:±1.7976931348623158e+308
4、内存管理
默认使用标准malloc/free,可通过cJSON_InitHooks自定义分配器
典型应用场景
嵌入式设备配置管理
网络通信协议(如MQTT)数据封装
跨平台数据交换
日志系统的结构化输出
