尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

好用的库代码简析

好用的库代码简析
📅 发布时间:2026/6/19 19:55:47

一、cJson库

1. 功能简述

  1. 处理json数据,支持创建、解析以及操作json数据,适用于嵌入式系统
  2. 特点:轻量、易用、跨平台
  3. 代码地址https://github.com/DaveGamble/cJSON.git,使用时只需要包含cJSON.c和cJSON.h

2. API介绍和使用

cJSON* cJSON_CreateObject(void);    // 创建一个空的cJSON对象
cJSON* cJSON_CreateArray(void);    // 创建一个空的cJSON数组
cJSON* cJSON_CreateString(const char *string);    // 创建一个字符串cJSON对象
cJSON* cJSON_CreateNumber(double num);            // 创建一个数字cJSON对象
cJSON_bool cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);    // 
cJSON* cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);  // 

3. 使用示例

// 创建JSON示例
cJSON *root = cJSON_CreateObject();                // 创建一个根节点
cJSON_AddStringToObject(root, "name", "John");     // 添加字符串对象到根节点中
cJSON_AddNumberToObject(root, "age", 30);          // 添加数字对象到根节点中
cJSON *hobbies = cJSON_AddArrayToObject(root, "hobbies");  // 添加数组对象到根节点中
if (hobbies != NULL)
{cJSON_AddItemToArray(hobbies, cJSON_CreateString("reading"));     // 往cJSON节点中添加字符串属性cJSON_AddItemToArray(hobbies, cJSON_CreateString("swimming"));    // 往cJSON节点中添加字符串属性cJSON_AddItemToArray(hobbies, cJSON_CreateString("coding"));      // 往cJSON节点中添加字符串属性
}
cJSON *friends = cJSON_AddArrayToObject(root, "friends");      // 添加数组对象到根节点中
if (friends != NULL)
{// 第一个朋友cJSON *friend1 = cJSON_CreateObject();cJSON_AddStringToObject(friend1, "name", "Alice");cJSON_AddNumberToObject(friend1, "age", 28);cJSON_AddItemToArray(friends, friend1);                    // 嵌套添加节点// 第二个朋友cJSON *friend2 = cJSON_CreateObject();cJSON_AddStringToObject(friend2, "name", "Bob");cJSON_AddNumberToObject(friend2, "age", 32);cJSON_AddItemToArray(friends, friend2);                    // 嵌套添加节点
}
char *json_string = cJSON_Print(root);             // 生成一个格式化的字符串带空格
printf("%s\n", json_string);
cJSON_free(json_string);                           // 对应cJSON_Print的释放函数
char *json_string1 = cJSON_PrintUnformatted(root);             // 生成一个紧凑的字符串不带空格
printf("%s\n", json_string1);
cJSON_free(json_string1);                           // 对应cJSON_PrintUnformatted的释放函数
cJSON_Delete(root);                                // 对应cJSON_CreateObject的释放函数
// 解析JSON示例
cJSON *json = cJSON_Parse(json_string);            // 输入json字符串生成cJSON根节点
if (root == NULL) {                                // 错误检查
    printf("解析错误\n");
    return;
}
cJSON *name = cJSON_GetObjectItemCaseSensitive(json, "name");  // 从cJSON节点中根据名称获得对应的cJSON对象
if (name != NULL && cJSON_IsString(name))
{const char *name_str = cJSON_GetStringValue(name);        // 处理字符串printf("姓名: %s\n", name_str);
}
cJSON_Delete(json);                                // 释放cJSON根节点

4. 主要数据结构与API实现方式

// 关键结构体
typedef struct cJSON
{struct cJSON *next;struct cJSON *prev;      // 双向链表组织cJSON结构体struct cJSON *child;     // json结构的子节点int type;                // json对象的类型char *valuestring;       // 字符串,类型是cJSON_String或cJSON_Raw时该值有效int valueint;            // 数值,整数值,被valuedouble替代double valuedouble;      // 数值,浮点数,类型是cJSON_Number时该值有效char *string;            // 名称
} cJSON;
// 内存分配和释放函数
malloc、free、realloc分别对应global_hooks结构体的三个成员
void cJSON_InitHooks(cJSON_Hooks* hooks);    // 该函数可以自定义内存的分配和释放函数
cJSON *cJSON_New_Item(const internal_hooks * const hooks);    // 该函数调用malloc函数返回一个cJSON的结构体并返回指针
unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks);  // 字符串复制函数,调用内存分配并memcpy
cJSON *cJSON_CreateObject(void);      // 调用cJSON_New_Item获得一个新的cJSON对象,并设置type为cJSON_Object
cJSON *cJSON_CreateArray(void);       // 调用cJSON_New_Item获得一个新的cJSON对象,并设置type为cJSON_Array
cJSON *cJSON_CreateNumber(double num);  // 调用cJSON_New_Item获得一个新的cJSON对象,并设置type为cJSON_Number,并设置valuedouble成员
cJSON *cJSON_CreateRaw(const char *raw);  // 调用cJSON_New_Item获得一个新的cJSON对象,并设置type为cJSON_Raw,并调用cJSON_strdup完成字符串
cJSON *cJSON_CreateString(const char *string);  // 同上,区别是type是cJSON_String
cJSON *cJSON_CreateIntArray(const int *numbers, int count);  // 数组表示一个节点,child成员是第一个数字节点,所有的数字节点使用双向链表连接
cJSON *cJSON_CreateFloatArray(const float *numbers, int count);  // 同上
cJSON *cJSON_CreateDoubleArray(const double *numbers, int count);  // 同上
cJSON *cJSON_CreateStringArray(const char *const *strings, int count);  // 同上
cJSON_bool cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);  // 添加元素到cJSON对象中
cJSON_bool cJSON_AddItemToArray(cJSON *array, cJSON *item);    // 添加元素到数组类型的cJSON对象中
cJSON_AddxxToObject;            //创建一个xx,并将xx放入Object中
char *cJSON_Print(const cJSON *item);  // 格式化输出json为字符串
char *JSON_PrintUnformatted(const cJSON *item);    // 压缩输出json为字符串
cJSON *cJSON_Parse(const char *value);    // 输入json字符串,输出JSON根节点
cJSON *name = cJSON_GetObjectItemCaseSensitive(json, "name");  // 从cJSON节点中根据名称获得对应的cJSON对象
cJSON_IsString是否是string
cJSON_IsNumber是否是number
cJSON_IsBool是否是布尔
cJSON_IsArray是否是数组,之后使用宏cJSON_ArrayForEach进行范围for循环,实际是一个for循环的封装
cJSON_GetStringValue返回json的字符串,类型不匹配返回NULL
cJSON_GetNumberValue返回json的数值,类型不匹配返回NAN

5. 需要关注的点

  1. cJSON_CreateRaw中的字符串是原始的,不进行转义
  2. cJSON_CreateIntArray创建了n+1个节点,其中一个节点作为父节点表示数组,其他的n个节点存储数据并通过双向链表连接
  3. cJSON_ArrayForEach看起来像是范围for循环,实际是for循环的封装
  4. 关注的有数值、字符串、数组、嵌套
  5. cJSON_CreateObject与cJSON_Delete对应
  6. 使用cJSON_Print和cJSON_PrintUnformatted的返回值需要使用cJSON_free释放
  7. 使用cJSON_AddxxToObject将json节点添加到Object,xx节点就不需要自己释放,释放Object的时候会释放掉xx
  8. cJSON_Parse与cJSON_Delete对应

相关新闻

  • 如何使用TensorRT实现模型热更新不停机?
  • RAG技术入门:检索增强生成如何让大模型更强大
  • Java计算机毕设之基于JAVA+springboot技术的电商精准营销推荐系统设计及实现基于JAVA技术的电商精准营销推荐系统设计及实现(完整前后端代码+说明文档+LW,调试定制等)

最新新闻

  • 2026年新发布上海可靠的企业反舞弊法律服务怎么选择?专家深度解析林东品律师 - 品牌鉴赏官2026
  • 从仿真到真实:构建高保真去模糊数据集的三种路径与实战指南
  • 2026年萧山区青少年Python课程新趋势与杭州科迪姆科技培训有限公司实力解析 - 品牌鉴赏官2026
  • 如何用思源宋体解决中文排版难题:5个实战技巧提升专业度
  • 2026年更新:贵阳中职教育选择指南,贵州工商职业大学的综合实力剖析 - 品牌鉴赏官2026
  • MPC555/556 TPU核心功能解析:DIO、SPWM、SIOP实战配置与硬件设计

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号