【cJSON】CJSON学习笔记(二)

简介:
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); 



参考博客:http://blog.csdn.net/xukai871105/article/details/33013455
相关文章
|
1月前
Lua
Lua
13 0
|
11月前
|
JSON 编译器 API
[✔️]lua-cjson 编译,在unity中使用cjson
[✔️]lua-cjson 编译,在unity中使用cjson
151 0
|
存储 JSON API
cJSON使用教程
cJSON是一个使用C语言编写的JSON数据解析器,具有超轻便,可移植,单文件的特点,使用MIT开源协议。
cJSON使用教程
|
存储 JSON JavaScript
cJSON生成json字符串
嵌入式开发中如果需要上云常常需要处理json字符串,这时候可以调用json库如:cJSON,jasson等。本文介绍cJSON库使用
|
机器学习/深度学习 移动开发 JSON
使用cJSON库解析JSON
cJSON库的下载 cJSON是一个基于C的JSON解析库,这个库非常简单,只有cJSON.c和cJSON.h两个文件,支持JSON的解析和封装,需要调用时,只需要#include "cJSON.h"就可以使用了, 库源码下载地址:cJSON download JSON官方网站:json 只包含键值对的JSON字符串解析 JSON字符串: { "name": "Andy", //键值对1 "age": 20 //键值对2 } 这个JSON对象只有两个键值对,键name对应字符串Andy,键age对应数字20。
2101 0
|
存储 JSON 数据格式