# libcJSON — JSON 解析/生成库 API 参考 ## 模块概述 libcJSON 是开源的轻量级 JSON 解析/生成库(MIT 许可证),直接使用原工程版本。 基于递归下降解析器 + 树状内存模型。支持 object/array/string/number/boolean/null。 ## 数据结构 ```c typedef enum { CJSON_NULL = 0, CJSON_FALSE, CJSON_TRUE, CJSON_NUMBER, CJSON_STRING, CJSON_ARRAY, CJSON_OBJECT } enum_cjson_type; typedef struct cjson { struct cjson *next, *prev; // 兄弟节点链表 struct cjson *child; // 子节点(对象/数组的第一个子元素) enum_cjson_type type; char *key; // 对象键名 char *val_str; // 字符串值 double val_num; // 数值 } stru_cjson; ``` ## 接口函数 ### 解析与释放 | 函数 | 说明 | |------|------| | `cJSON_Parse(json)` | 解析 JSON 字符串,返回根节点 | | `cJSON_Delete(node)` | 递归释放整棵树 | ### 查询 | 函数 | 说明 | |------|------| | `cJSON_GetObjectItem(obj, key)` | 按 key 获取对象成员 | | `cJSON_GetArraySize(arr)` | 获取数组长度 | | `cJSON_GetArrayItem(arr, idx)` | 获取数组元素(0-based) | | `cJSON_GetStringValue(it)` | 获取字符串值 | | `cJSON_GetNumberValue(it)` | 获取数值 | ### 创建 | 函数 | 说明 | |------|------| | `cJSON_CreateObject()` | 创建空对象 `{}` | | `cJSON_CreateArray()` | 创建空数组 `[]` | | `cJSON_CreateString(s)` | 创建字符串节点 | | `cJSON_CreateNumber(n)` | 创建数值节点 | | `cJSON_CreateBool(b)` | 创建 true/false | | `cJSON_CreateNull()` | 创建 null | ### 修改 | 函数 | 说明 | |------|------| | `cJSON_AddItemToObject(obj, key, item)` | 向对象添加键值对 | | `cJSON_AddItemToArray(arr, item)` | 向数组追加元素 | | `cJSON_DeleteItemFromObject(obj, key)` | 删除对象成员 | ### 序列化 | 函数 | 说明 | |------|------| | `cJSON_Print(node)` | 序列化为紧凑 JSON 字符串(调用者 free) | ## 使用示例 ```c #include "cJSON.h" #include #include int main(void) { // --- 解析 JSON --- const char *json = "{\"name\":\"RTU\",\"addr\":1,\"items\":[1,2,3]}"; stru_cjson *root = cJSON_Parse(json); const char *name = cJSON_GetStringValue(cJSON_GetObjectItem(root, "name")); double addr = cJSON_GetNumberValue(cJSON_GetObjectItem(root, "addr")); printf("name=%s, addr=%.0f\n", name, addr); // 输出: name=RTU, addr=1 // 遍历数组 stru_cjson *arr = cJSON_GetObjectItem(root, "items"); int n = cJSON_GetArraySize(arr); for (int i = 0; i < n; i++) { printf(" [%d] = %.0f\n", i, cJSON_GetNumberValue(cJSON_GetArrayItem(arr, i))); } cJSON_Delete(root); // --- 创建 JSON --- stru_cjson *obj = cJSON_CreateObject(); cJSON_AddItemToObject(obj, "status", cJSON_CreateString("ok")); cJSON_AddItemToObject(obj, "code", cJSON_CreateNumber(200)); char *out = cJSON_Print(obj); printf("生成的 JSON: %s\n", out); // {"status":"ok","code":200} free(out); cJSON_Delete(obj); return 0; } ``` ## 依赖关系 - **依赖**: `stdlib.h`, `string.h`, `stdio.h`, `math.h` - **被依赖**: 配置文件解析、Web API 交互 等模块