0.前言
    本文试图说明怎样使用CJSON构造各种各样的JSON数据包。在前段时间已经写过一篇cJSON的文章,所以本文成为“续集”。
    【相关博文】
    【前端学习——JSON学习】——学习各种各样的JSON格式
    【cJSON学习笔记】——本学习笔记的前一“集”。

    【代码仓库】——cJSON-Example
    代码仓库位于bitbucket使用Hg(而不是Git),Hg在windows或ubuntu上均有非常好用的GUI工具——TortoiseHg。本人愚笨没能熟练掌握git。
    【TortoiseHg使用说明】——假设没有使用过Hg请參考博文,參考clone部分操作就可以。
    【測试工具】
    【ubuntu】eclipse+gcc
    【windows】eclipse+mingw
1.重要函数说明
    【1】两个创建
    【创建JSON对象】cJSON *cJSON_CreateObject(void);
    【创建JSON数组】cJSON *cJSON_CreateArray(void);
    
    【2】两种加入
    【向对象中加入】voidcJSON_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数字
void create_single_number(void) {
cJSON *root;
char *out;
int value = 24; root = cJSON_CreateObject(); // 创建根 cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(value)); // 打印并释放
out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out); // 控制台输出
#if 0
{
"value": 24
}
#endif
}
    【简单说明】
    【1】cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(value)); 
    【2】cJSON_AddNumberToObject(root, "value", value); 
    【1】和【2】效果全然同样。
    【2】JSON字符串
void create_single_string(void) {
cJSON *root;
char *out;
char *name = "xukai871105"; root = cJSON_CreateObject(); // 创建根
// 方法 使用cJSON_AddItemToObject,推荐使用
cJSON_AddItemToObject(root, "name", cJSON_CreateString(name)); // 打印并释放
out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out); // 控制台输出
#if 0
{
"name": "xukai871105"
}
#endif
}
    【简单说明】
    【1】 cJSON_AddItemToObject(root, "name", cJSON_CreateString(name));
    【2】 cJSON_AddStringToObject(root, "name",name);
    【1】和【2】效果全然同样。

    【3】JSON布尔类型
void create_bool(void) {
cJSON *root;
char *out; root = cJSON_CreateObject(); // 创建根 cJSON_AddItemToObject(root, "success", cJSON_CreateFalse()); // 打印并释放
out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out); // 控制台输出
#if 0
{
"success": false
}
#endif
}
    【简单说明】
    【1】布尔类型不须要加引號。
3.JSON格式嵌套
    JSON格式在使用时往往存在嵌套,比如JSON对象中嵌套JSON数组而JSON数组中嵌套JSON对象。以下就通过几个简单的样例说明问题。

    【1】JSON简单嵌套
void create_simple(void) {
cJSON *root;
char *out;
int list[4] = {5,6,7,8}; root = cJSON_CreateObject(); // 创建根
cJSON_AddItemToObject(root, "lists", cJSON_CreateIntArray(list, 4)); // 打印并释放
out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out); // 控制台输出
#if 0
{
"lists": [5, 6, 7, 8]
}
#endif
}
    【2】JSON复杂嵌套
void create_complex(void) {
cJSON *root, *rows, *row;
char *out;
int i = 0; char *title[3] = { "树莓派学习笔记——索引博文",
"树莓派学习笔记——GPIO功能学习",
"物联网学习笔记——索引博文"};
char *url[3] = { "http://blog.csdn.net/xukai871105/article/details/23115627",
"http://blog.csdn.net/xukai871105/article/details/12684617",
"http://blog.csdn.net/xukai871105/article/details/23366187"}; root = cJSON_CreateObject(); // 创建根
cJSON_AddNumberToObject(root, "total", 3); // 在object中加入array
cJSON_AddItemToObject(root, "rows", rows = cJSON_CreateArray()); for(i = 0; i < 3; i++) {
// 在array中加入object
cJSON_AddItemToArray(rows, row = cJSON_CreateObject());
cJSON_AddItemToObject(row, "title", cJSON_CreateString(title[i]));
cJSON_AddItemToObject(row, "url", cJSON_CreateString(url[i]));
} // 打印并释放
out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out); // 控制台输出
#if 0
{
"total": 3,
"rows": [{
"title": "树莓派学习笔记——索引博文",
"url": "http://blog.csdn.net/xukai871105/article/details/23115627"
}, {
"title": "树莓派学习笔记——GPIO功能学习",
"url": "http://blog.csdn.net/xukai871105/article/details/12684617"
}, {
"title": "物联网学习笔记——索引博文",
"url": "http://blog.csdn.net/xukai871105/article/details/23366187"
}]
}
#endif
}
    【简单说明】
rows为JSON对象。rows对象中嵌套JSON数组,每个JSON数组的元素又是一个JSON对象,该该对象名为row。row对象中具有两个键值对。各自是titile和url。

cJSON学习笔记 续集的更多相关文章

  1. cJSON学习笔记

    1.JSON格式简述 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.它基于JavaScript(Standa ...

  2. turtle学习笔记续集

    turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制.turtle图形绘制的概念诞生于1969年,成功应用于LOGO编程语言. turtle库绘制图形有一个基本框架:一个小海龟 ...

  3. DirectX 11游戏编程学习笔记之1: 开场白

    本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com           这是我之前的博客系列"DirectX9.0c游戏开发手记之'龙书'第二版学习笔记 ...

  4. tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)

    续集请点击我:tensorflow学习笔记——使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  9. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

随机推荐

  1. apache rewrite 规则

    啥是虚拟主机呢?就是说把你自己的本地的开发的机子变成一个虚拟域名,比如:你在开发pptv下面的一个项目 127.0.0.1/pptv_trunk,你想把自己的机器域名变成www.pptv.com.那么 ...

  2. 如何HACK无线家用警报器?

    30年前,报警器都是硬连线的,具有分立元件,并由钥匙开关操作.20年前,他们已经演变为使用微控制器,LCD和键盘,但仍然是硬连线.10年前,无线报警器开始变得普及,并增加了许多之前没有的功能. 而如今 ...

  3. ChainingHash

    public class ChainingHash<Key,Value>{ private int N; private int M; private doublylinked<Ke ...

  4. Prepare paddle in Docker1

    Use Docker 1. Install Docker sudo apt-get install -y docker.io a) pull repository from server in Chi ...

  5. Kaggle:Home Credit Default Risk 特征工程构建及可视化(2)

    博主在之前的博客 Kaggle:Home Credit Default Risk 数据探索及可视化(1) 中介绍了 Home Credit Default Risk 竞赛中一个优秀 kernel 关于 ...

  6. 防盗链技术终极解决方案(squid+cookie)

    防盗链技术现状:1.通过识别Referer确认请求来源页面2.Apache,squid等都能对Referer进行识别3.通过ActiveX显示的内容不向服务器提供Referer Header(例如,F ...

  7. php获取真实ip地址(转)

    REMOTE_ADDR只能获取访问者本地连接中设置的IP,如中南民族大学校园网中自己设置的10.X.XXX.XXX系列IP,而这个函数获取的是局域网网关出口的IP地址, 如果访问者使用代理服务器,将不 ...

  8. xdoj-1243 (费马平方和问题)

    1243: CKJ老师爱数学 时间限制: 1 Sec  内存限制: 128 MB提交: 56  解决: 13[提交][状态][讨论版] 题目描述 众所周知,CKJ老师非常热爱数学,他对于方程组的有自己 ...

  9. FTP相关、用vsftpd搭建ftp、xshell使用xftp传输文件、使用pure-ftpd搭建ftp服务

    1.FTP相关(file transfer protocol,文件传输协议)   2.用vsftpd搭建ftp安装:yum install vsftpd -y创建一个虚拟用户:useradd  vft ...

  10. CSU 1588 合并果子

    Description 现在有n堆果子,第i堆有ai个果子.现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数.求合并所有果子的最小代价. Input 第一行包含一个整数T(T<=5 ...