【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

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

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