cJSON学习笔记 续集

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】两种添加

【向对象中添加】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数字

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学习笔记 续集,布布扣,bubuko.com

时间: 2024-12-24 13:39:26

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

Java基础学习笔记

File 的高级获取功能 String[] list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录 示例 import java.io.File; class FileDemo9 { public static void  main(String[] args) { //获取E:下所有目录或者文件名称 File file=new  File("E:\\");//1.构建文件对象 String[]  fileNames=file.list();//2.获取E

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

本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系[email protected] ? ? ? ? ? 这是我之前的博客系列"DirectX9.0c游戏开发手记之'龙书'第二版学习笔记"的平行版,也可以说是续集. 说是平行版,由于这两个博客系列由于某种显而易见的原因.内容是非常平行的:而之所以说是续集,是由于前面那个系列可能就此坑掉了-- ? ? ? ? 前面那个系列是关于"龙书"第二版的学习笔记的.而这一系列是关于"龙书"第四版的.&qu

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Activiti 学习笔记记录(三)

上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl