zoukankan      html  css  js  c++  java
  • cJSON学习笔记 续集

    转自:http://blog.csdn.net/xukai871105/article/details/33013455

    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数字
    [cpp] view plaincopy在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 ",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 plaincopy在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 ",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 plaincopy在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 ",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 plaincopy在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 ",out); free(out);  
    11.   
    12.     // 控制台输出  
    13. #if 0  
    14.     {  
    15.         "lists": [5, 6, 7, 8]  
    16.     }  
    17. #endif  
    18. }  
        【2】JSON复杂嵌套
    [cpp] view plaincopy在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 ",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。
  • 相关阅读:
    JS的数据类型
    JS瀑布流布局模式(2)
    Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)——无非是在传统遍历过程中修改叶子结点加入后继结点信息(传统是stack记录),然后再删除恢复
    leetcode 538. Convert BST to Greater Tree
    python 闭包变量不允许write,要使用nonlocal
    机器学习中,有哪些特征选择的工程方法?
    python利用决策树进行特征选择
    机器学习 不均衡数据的处理方法
    python dns server开源列表 TODO
    python dig trace 功能实现——通过Querying name server IP来判定是否为dns tunnel
  • 原文地址:https://www.cnblogs.com/x_wukong/p/4466463.html
Copyright © 2011-2022 走看看