【cJSON】CJSON学习笔记(四)

2024-08-31 09:08
文章标签 cjson 笔记 学习

本文主要是介绍【cJSON】CJSON学习笔记(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来自https://yq.aliyun.com/articles/23908?spm=5176.100239.blogcont23909.22.b57b266nePTks

摘要: 1.重要函数说明     【1】两个创建     【创建JSON对象】cJSON *cJSON_CreateObject(void);     【创建JSON数组】cJSON *cJSON_CreateArray(void);          【2】两种添加     【向对...

1.重要函数说明
    【1】两个创建
【创建JSON对象】cJSON *cJSON_CreateObject(void);
【创建JSON数组】cJSON *cJSON_CreateArray(void);

    【2】两种添加
【向对象中添加】void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
【向数组中添加】void cJSON_AddItemToArray(cJSON *array, cJSON *item);

    【3】常用几招
【向对象中增加数字】cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(value));
【向对象中增加文件】cJSON_AddItemToObject(root, "string", cJSON_CreateString(string));

    【4】JSON嵌套
【向对象中增加数组】cJSON_AddItemToObject(root, "rows", rows = cJSON_CreateArray());
【向数组中增加对象】cJSON_AddItemToArray(rows, row = cJSON_CreateObject());

2.创建各种各样的JSON数据包
在这里通过代码举几个例子,更多的内容请查看代码仓库中的相关文件。
    【1】JSON数字
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void create_single_number(void) {  
  2.     cJSON *root;  
  3.     char *out;  
  4.     int value = 24;  
  5.   
  6.     root = cJSON_CreateObject(); // 创建根  
  7.   
  8.     cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(value));  
  9.   
  10.     // 打印并释放  
  11.     out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);  
  12.   
  13.     // 控制台输出  
  14. #if 0  
  15.     {  
  16.         "value": 24  
  17.     }  
  18. #endif  
  19. }  
    【简单说明】
【1】cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(value)); 
【2】cJSON_AddNumberToObject(root, "value", value); 
【1】和【2】效果完全相同。

    【2】JSON字符串
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void create_single_string(void) {  
  2.     cJSON *root;  
  3.     char *out;  
  4.     char *name = "xukai871105";  
  5.   
  6.     root = cJSON_CreateObject(); // 创建根  
  7.     // 方法 使用cJSON_AddItemToObject,推荐使用  
  8.     cJSON_AddItemToObject(root, "name", cJSON_CreateString(name));  
  9.   
  10.     // 打印并释放  
  11.     out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);  
  12.   
  13.     // 控制台输出  
  14. #if 0  
  15.     {  
  16.         "name""xukai871105"  
  17.     }  
  18. #endif  
  19. }  
    【简单说明】
【1】 cJSON_AddItemToObject(root, "name", cJSON_CreateString(name));
【2】 cJSON_AddStringToObject(root, "name",name);
【1】和【2】效果完全相同。

    【3】JSON布尔类型
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void create_bool(void) {  
  2.     cJSON *root;  
  3.     char *out;  
  4.   
  5.     root = cJSON_CreateObject(); // 创建根  
  6.   
  7.     cJSON_AddItemToObject(root, "success", cJSON_CreateFalse());  
  8.   
  9.     // 打印并释放  
  10.     out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);  
  11.   
  12.     // 控制台输出  
  13. #if 0  
  14.     {  
  15.         "success"false  
  16.     }  
  17. #endif  
  18. }  
    【简单说明】
【1】布尔类型不需要加引号。

3.JSON格式嵌套
JSON格式在使用时往往存在嵌套,例如JSON对象中嵌套JSON数组而JSON数组中嵌套JSON对象,下面就通过几个简单的例子说明问题。
    【1】JSON简单嵌套
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void create_simple(void) {  
  2.     cJSON *root;  
  3.     char *out;  
  4.     int list[4] = {5,6,7,8};  
  5.   
  6.     root = cJSON_CreateObject(); // 创建根  
  7.     cJSON_AddItemToObject(root, "lists", cJSON_CreateIntArray(list, 4));  
  8.   
  9.     // 打印并释放  
  10.     out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);  
  11.   
  12.     // 控制台输出  
  13. #if 0  
  14.     {  
  15.         "lists": [5, 6, 7, 8]  
  16.     }  
  17. #endif  
  18. }  
    【2】JSON复杂嵌套
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void create_complex(void) {  
  2. cJSON *root, *rows, *row;  
  3. char *out;  
  4. int i = 0;  
  5.   
  6. char *title[3] = { "树莓派学习笔记——索引博文",  
  7. "树莓派学习笔记——GPIO功能学习",  
  8. "物联网学习笔记——索引博文"};  
  9. char *url[3] = { "http://blog.csdn.net/xukai871105/article/details/23115627",  
  10. "http://blog.csdn.net/xukai871105/article/details/12684617",  
  11. "http://blog.csdn.net/xukai871105/article/details/23366187"};  
  12.   
  13. root = cJSON_CreateObject(); // 创建根  
  14. cJSON_AddNumberToObject(root, "total", 3);  
  15.   
  16. // 在object中加入array  
  17. cJSON_AddItemToObject(root, "rows", rows = cJSON_CreateArray());  
  18.   
  19. for(i = 0; i < 3; i++) {  
  20. // 在array中加入object  
  21. cJSON_AddItemToArray(rows, row = cJSON_CreateObject());  
  22. cJSON_AddItemToObject(row, "title", cJSON_CreateString(title[i]));  
  23. cJSON_AddItemToObject(row, "url", cJSON_CreateString(url[i]));  
  24. }  
  25.   
  26. // 打印并释放  
  27. out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);  
  28.   
  29. // 控制台输出  
  30. #if 0  
  31. {  
  32. "total": 3,  
  33. "rows": [{  
  34. "title""树莓派学习笔记——索引博文",  
  35. "url""http://blog.csdn.net/xukai871105/article/details/23115627"  
  36. }, {  
  37. "title""树莓派学习笔记——GPIO功能学习",  
  38. "url""http://blog.csdn.net/xukai871105/article/details/12684617"  
  39. }, {  
  40. "title""物联网学习笔记——索引博文",  
  41. "url""http://blog.csdn.net/xukai871105/article/details/23366187"  
  42. }]  
  43. }  
  44. #endif  
  45. }  
    【简单说明】
rows为JSON对象,rows对象中嵌套JSON数组,每一个JSON数组的元素又是一个JSON对象,该该对象名为row,row对象中具有两个键值对,分别是titile和url。

2015/08/19 17:50

【其他参考示例】

1. 函数的使用

宏的定义原型:
/* Macros for creating things quickly. */
#define cJSON_AddNullToObject(object,name)      cJSON_AddItemToObject(object, name, cJSON_CreateNull())
#define cJSON_AddTrueToObject(object,name)      cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
#define cJSON_AddFalseToObject(object,name)     cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
#define cJSON_AddBoolToObject(object,name,b)    cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
#define cJSON_AddNumberToObject(object,name,n)  cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
#define cJSON_AddStringToObject(object,name,s)  cJSON_AddItemToObject(object, name, cJSON_CreateString(s))

示例:
cJSON *root = cJSON_CreateObject();   //先创建一个对象
cJSON_AddNumberToObject(root, "value", 123.4);
cJSON_AddStringToObject(root, "year", "2015");
cJSON_AddNullToObject(root, "secret");
cJSON_AddTrueToObject(root, "Bool");
cJSON_AddFalseToObject(root, "false");
cJSON_AddBoolToObject(root, "Yes", 3);
cJSON_AddBoolToObject(root, "Yes", 0);
out = cJSON_Print(root);     //打印对象
//out = cJSON_PrintUnformatted(root);   //非格式化的打印
//printf("===> 2: %s\n", out);
printf("%s\n", out);
cJSON_Delete(root);   //释放对象所占的内存
free(out);

函数的原型:
/* These calls create a cJSON item of the appropriate type. */
extern cJSON *cJSON_CreateNull(void);
extern cJSON *cJSON_CreateTrue(void);
extern cJSON *cJSON_CreateFalse(void);
extern cJSON *cJSON_CreateBool(int b);
extern cJSON *cJSON_CreateNumber(double num);
extern cJSON *cJSON_CreateString(const char *string);
extern cJSON *cJSON_CreateArray(void);
extern cJSON *cJSON_CreateObject(void);

示例:参考上面博客的代码

函数原型:
/* These utilities create an Array of count items. */
extern cJSON *cJSON_CreateIntArray(const int *numbers,int count);
extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count);
extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count);
extern cJSON *cJSON_CreateStringArray(const char **strings,int count);

/* Append item to the specified array/object. */
extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
extern void cJSON_AddItemToObjectCS(cJSON *object,const char *string,cJSON *item); 

示例:
char *out = NULL;  
int array[] = {1, 2, 3, 4};
int array1[] = {1, 2, 3, 4, 5, 6};
cJSON *json = NULL;
cJSON *item = NULL;
cJSON *tmp = NULL;

json  = cJSON_CreateObject();
//cJSON_AddItemToObject(json,"array",  cJSON_CreateIntArray(array, 4));   //与下面两行等价
item = cJSON_CreateIntArray(array, 4);
cJSON_AddItemToObject(json, "array", item);
out = cJSON_Print(json);
printf("%s\n", out);

printf("=========================\n");
printf("size: %d\n", cJSON_GetArraySize(item));   //输出为4  4个元素

tmp = cJSON_GetArrayItem(json, 0);   //获取json中的第一个节点
if (NULL != tmp)
{  
printf("ok..\n");  
printf("size: %d\n", cJSON_GetArraySize(tmp));
}  
else
printf("error...\n");

    //此时item数组中的元素有  1 2 3 4 5 6 7 
printf("=========================\n");
cJSON_AddItemToArray(item, cJSON_CreateNumber(5));
cJSON_AddItemToArray(item, cJSON_CreateNumber(6));
cJSON_AddItemToArray(item, cJSON_CreateNumber(7));
printf("size: %d\n", cJSON_GetArraySize(item));
out = cJSON_Print(json);
printf("%s\n", out);

tmp = cJSON_CreateIntArray(array1, 6);
    //cJSON_AddItemToObject(json, "array1", tmp);   //好像与下面一句话等价呢
cJSON_AddItemReferenceToObject(json, "array1", tmp);
out = cJSON_Print(json);
printf("%s\n", out);


    //整形数组的参考示例
int array3[] = {1, 3, 5, 7, 9};
json = cJSON_CreateIntArray(array3, 5);
out = cJSON_Print(json);    cJSON_Delete(json);     printf("%s\n", out);    free(out); 

    //字符指针数组
const char *strings[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
json = cJSON_CreateStringArray(strings, 7);  
    out = cJSON_Print(json);     cJSON_Delete(json);    printf("%s\n", out);    free(out); 

这篇关于【cJSON】CJSON学习笔记(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123470

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件