cJSON 轻量级 JSON 解析库:高效解析 JSON 数据,适用于嵌入式设备和低资源环境

cJSON 是一个轻量级 JSON 解析库,仅 500 行 C 代码,高效解析 JSON 数据,适用于嵌入式设备和低资源环境。

cJSON 被物联网设备、工业控制系统广泛采用,成为 C 语言生态中 JSON 处理的标杆。

cJSO核心特点

单文件实现(仅需cJSON.ccJSON.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.ccJSON.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)数据封装

跨平台数据交换

日志系统的结构化输出