【cJSON】CJSON学习笔记(二)

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数字

[cpp] view
plain
copy

  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

  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

  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

  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

  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); 

参考博客:http://blog.csdn.net/xukai871105/article/details/33013455

时间: 2024-09-22 16:43:38

【cJSON】CJSON学习笔记(二)的相关文章

C#学习笔记(二)

笔记 C#学习笔记(二) write by cash(天下第七)2002.01.20版权所有,翻录不究cashcao@msn.com 选择 我身上携带着精神.信仰.灵魂 思想.欲望.怪癖.邪念.狐臭它们寄生于我身体的家 我必须平等对待我的每一位客人-----------伊沙:<原则> 我的名字是cash,所以我很功利主义:我的星像是Leo,所以我很大男人主义:我的语言是C#,所以我有点儿拿不定主义. /* 你能看得出来,这不是一篇正规的技术文章,所以若你不小心从里边读到了一个爱情故事,可不要奇

kvm虚拟化学习笔记(二)之linux kvm虚拟机安装

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1289627 KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795 kvm虚拟化学习笔记(二)之linuxkvm虚拟机安装htt

Bootstrap3学习笔记(二)之排版_javascript技巧

在上篇文章给大家介绍了BootStrap3学习笔记(一)之网格系统 对于标题,Bootstrap已经修改了h1--h6的样式,如果需要副标题,还可以在其中使用small标记 <h1>h1. Bootstrap heading <small>Secondary text</small></h1> <h2>h2. Bootstrap heading <small>Secondary text</small></h2>

MyBatis学习笔记(二)之关联关系_java

今天主要学习的关联关系是一对一关系与一对多关系. 一.一对一关系 还是通过例子来解释说明.(一个妻子对应一个丈夫). 1)数据库信息 create table t_wife( id int primary key auto_increment, wife_name varchar(), fk_husband_id int ); create table t_husband( id int primary key auto_increment, husband_name varchar() );

Java的“对象思想”学习笔记[二]

笔记|对象 在这篇文章里我将介绍一些Java对于对象的基本处理模式的问题. 首先看一个有关对象相等性(Object equivalence)的例子: 先看下面的代码: public class EqualTest1{ public static void main(String[] args){ Integer n1 = new Integer(20); Integer n2 = new Integer(20); System.out.println(n1 = = n2); System.out

Hadoop学习笔记二 安装部署

硬件环境 共有3台机器,均使用的FC5系统,Java使用的是jdk1.6.0.IP配置如下: dbrg-1:202.197.18.72 dbrg-2:202.197.18.73 dbrg-3:202.197.18.74 这里有一点需要强调的就是,务必要确保每台机器的主机名和IP地址之间能正确解析. 一个很简单的测试办法就是ping一下主机名,比如在dbrg-1上ping dbrg-2,如果能ping通就OK!若不能正确解析,可以修改/etc/hosts文件,如果该台机器作Namenode用,则需

kvm虚拟化学习笔记(二十一)之KVM性能优化学习笔记

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1606422 本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6.x系列操作系统下KVM优化的点,有很多都是默认支持开启了的,除了采用virtio方式的磁盘IO,与网络IO接口

kvm虚拟化学习笔记(二十)之convirt安装linux系统

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1306526 情况说明: (1)本文接前文kvm虚拟化学习笔记(十九)之convirt集中管理平台搭建,采用convirt虚拟化平台安装linux操作系统的过程,这个过程中需要对convirt进行一系列的配置才能真正的使用convirt来实现管理.(2)convirt2.1.1是一套kvm/xen虚拟机管理工具,该管理工具

python网络编程学习笔记(二):socket建立网络客户端_python

1.建立socket 建立socket对象需要搞清通信类型和协议家族.通信类型指明了用什么协议来传输数据.协议的例子包括IPv4.IPv6.IPX\SPX.AFP.对于internet通信,通信类型基本上都是AF_INET(和IPv4对应).协议家族一般表示TCP通信的SOCK_STREAM或者表示UDP通信的SOCK_DGRAM.因此对于TCP通信,建立一个socket连接的语句为:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)对于UDP通

cmake 学习笔记(二)

在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) 字符串列表 A;B;C # 分号分割或空格分隔的值 变量(字符串或字符串列表) set(Foo a b c) 设置变量 Foo command(${Foo}) 等价于 command(a b c) command("${Foo}") 等价于 command("a b c"