cJSON 的 应用 攻略。 (这不是一篇 小白教程 而是一篇 对 cJSON 应用 有点东西 的思考成果)
目前技术经理 提供成长学习星球 加V 13106543984 (299 48小时内可退)
提供程序员成长学习地图 提供成长学习通道 减少自我摸索的过程
专职提供服务
Linux C C++ 初级程序员入行
Linux C C++ 中级程序员进阶
Linux C C++ 高级程序员成型
技术转管理进阶 带团队解决问题
简历打造 跳槽时机 工作指导 职场发展 解惑答疑等
对于刚要入行 初级程序升中级 有极大收益
中级升高级 高级升管理 有较大收益
1. cJSON 名字
JSON:JavaScript Object Notation。 (JavaScript对象表示法)
是一种轻量级的数据交换格式。
2.cJSON 样貌
JSON 里面就包含 两种 结构
对象 :{key:vlaue}
数组 : [key:value]
终极关键内涵:vlaue 可以是 数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true或false)、数组(在方括号中)、对象(在花括号中)、null。
终极关键内涵:vlaue 可以是 数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true或false)、数组(在方括号中)、对象(在花括号中)、null。
终极关键内涵:vlaue 可以是 数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true或false)、数组(在方括号中)、对象(在花括号中)、null。
重要的事情说 3 遍, 对cJson 文件格式的 理解 就都在 上面这句里面了哦。在运用过程中 请自行 YY。讲的太透就没啥意思了。
3.cJSON 核心
关键结构体
typedef struct cJSON {
struct cJSON *next,*prev; /* 遍历数组或对象链的前向或后向链表指针*/
struct cJSON *child; /*数组或对象的孩子节点*/
int type; /* vlue的类型*/
char *valuestring; /*字符串值*/
int valueint; /* 整数值*/
double valuedouble; /* 浮点数值*/
char *string; /* key的名字*/
} cJSON;
cJSON api 中有 很多 这样的 cJSON 结构体指针。(api 指针 都不知道啥 意思, 感觉躲在厕所反思一波 ,为啥不知道- -,然后自行百度! )
对这个结构体的理解 直接 决定了 是否能 精准有效的 调用 cJSON 的 相关api。
终极关键结构体理解:
struct cJSON *next,*prev; 链表 链表结构
struct cJSON *child 子节点 树型结构
这2个东西 是 结构体 精髓 对应着 上面的 对象 和 数组哦。 如有兴趣 可以深挖,会有惊喜 它对我们调用api 来说 是透明的。这里就不展开(透明请自行百度).
4.cJSON 召唤 :
git clone https://github.com/DaveGamble/cJSON
cd cJSON
mkdir build
cd build
cmake ..
make
sudo make install
生成 so库后,编译时包含库路劲, 包含 .h 头文件 便可以调用api 了。
上述命令不懂的 自行做功课哦(少开一局农药,都会学到很多命令哦)。
5.cJSON 技能:
它的技能: 增 删 读 写 变 转 (临兵斗者。。。 它的技能就是这个华丽)
增:
数组 : cJSON *json_array = cJSON_CreateArray();
添加 数组 或 对象 value 接口 :cJSON_AddItemToArray(json_array, json_obj)
添加 普通value cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "C" ));
对象:cJSON *json_obj = cJSON_CreateObject();
添加 普通value cJSON_AddNumberToObject(json_obj, "repeat", appointment.repeat);
添加 数组 或 对象 value 接口 cJSON_AddItemToObject(json_array, "repeat", json_obj);
备注 这里Object api Add包含 item 增加的, 都是加的 json指针结构,如果 Add 后面 数据类型 加的 普通jesn 类型结构
删:
数组:cJSON_DeleteItemFromObject(cj_obj , key); /* key 为 string 看不懂 看 左键点接口 看 api 原型*/
对象:cJSON_DeleteItemFromArray(cj_array , index); /*index 为数组元素下表 从0开始 ( 别问问什么,问了就暴露水平)*/
读:
数组 :cJSON *array_node = cJSON_GetObjectItem(cj_obj, key) 。
对象 :cJSON *obj_node = cJSON_GetObjectItem(cj_obj, key) /* 通过 obj_node 指针 读取里里面的元素 num string */ (不懂可以自行理解 可以get 不少东西哦)。
备注:如果 obj_node array_node 不是最终节点(孩子尾节点)是可以嵌套持续调的哦 。
为啥这里 同一个api 要写两边嘛 不管 时 结构体 还是 数组 他们都是有 cJSON* 指针类型的哦。
写:
数组: cJSON_ReplaceItemInArray(cj_array, index, json_obj);
对象:cJSON_ReplaceItemInObject(cj_object, "voice_volume", cJSON_CreateNumber(static_cast<int>(volume));
备注:这里的写 都是 通过 替换完成的 。 不能直接赋值哦
变:
将 cJSON* 结构 转成 const char* 类型的 字符串
cJSON_Print(cj_root_) 自行考虑 delete 和 free (不想做 内存泄露 )
可以把 字符串 写到 .json 里面保存哦。
转:
将 const char* 字符串 转成 cJSON*结构类型
cJSON_Pare(const char* file_contents) ;
5. cJSON 项目实例
请加微信:13106543984 私信交流。